C++ 关于c+中常量的快速说明+;

C++ 关于c+中常量的快速说明+;,c++,methods,constants,return,C++,Methods,Constants,Return,我知道声明返回类型const的正确方法是: int foo() const; int foo() const; 但在某些情况下,这对我不起作用,那么我可以使用: const int foo(); 它们之间的区别是什么?为什么我可以在所有情况下使用后者,而不是第一种 我不能使用第一个的一个例子是,当我想要返回在方法之外定义的布尔数组时 亲切问候, /马库斯 我知道声明返回类型const的正确方法是: int foo() const; int foo() const; 你的理解不正确。上面

我知道声明返回类型const的正确方法是:

int foo() const;
int foo() const;
但在某些情况下,这对我不起作用,那么我可以使用:

const int foo();
它们之间的区别是什么?为什么我可以在所有情况下使用后者,而不是第一种

我不能使用第一个的一个例子是,当我想要返回在方法之外定义的布尔数组时

亲切问候,

/马库斯

我知道声明返回类型const的正确方法是:

int foo() const;
int foo() const;
你的理解不正确。上面所做的是将
foo()
声明为
const
成员函数。这与
foo()
的返回类型没有任何关系


有关更多信息,请参见前一个用于类的方法函数。这意味着此方法函数不会(逻辑上)更改对象的数据

int foo() const;
const int foo();
这不会声明返回类型
const
。它声明它是一个
const
成员函数:可以对
const
对象调用它,并且不允许修改对象的任何(非
可变的
)成员

int foo() const;
const int foo();

这声明返回类型为
const
;但是这样做没有多大意义。

第一种方法意味着该方法不会(直接或间接)更改任何类成员变量。这基本上意味着在此方法中不能分配任何类成员,只能在方法体中调用
()const


第二个示例表示返回值不能更改。

只有第二个示例将返回类型声明为const。因此,如果您想返回一个常量值,这就是实现它的方法(也是我相信的唯一方法)

第一个代码段指出,非静态成员函数中的
this
指针指向常量对象(即该方法不会修改该对象)。

int foo()const
表示
foo()
作为成员函数不会修改类的数据成员


const int foo()
表示
foo()
是一个返回值为
const int
(实际上是
int
)的函数。

const修改它前面的内容;在

int foo() const;
它是常量函数,而不是返回值。(由 定义,如果函数的
指针类型为
指向常量的指针。只有成员函数可以是常量。)

要使返回类型为常量,请将
常量放置在
返回类型,例如:

int const foo();
但是请注意,对于非类类型,此常量被忽略;回归 值将是一个右值(临时值),并且只有类类型右值具有 cv合格类型。(我认为一些编译人员甚至会警告 )首先

int foo() const;

是一对可以定义为类成员函数的函数。它们的返回类型都是int

当该类的const对象调用函数foo()时,第一个将响应

此函数

const int foo();

可以在任何地方定义。返回类型为const int,因此必须将函数分配给const int变量。

int foo()const不使返回类型
const
。这意味着
foo()
是类的成员函数,并且
foo()
承诺不会对
*这个
对象进行任何更改。实际上,
int const foo()
声明了一个返回类型为
int
的函数。函数的返回类型不能为
int const
,因为非类Rvalue总是有cv非限定类型。是吗?函数的返回类型是prvalue(如果不是尊重),非类类型的prvalue永远不会是cv限定的,因此
int const foo()
是非法的,或者它声明了返回类型为
int
的函数。(我宁愿它是非法的,但我认为出于历史原因,它被接受了,
const
被忽略了。)@JamesKanze:它被忽略的部分原因可能是因为它是冗余的(无论是否使用const,都无法修改它),部分原因是为了与类类型保持一致(标准在使用模板时必须考虑的一个较不特殊的情况!)@KenWayneVanderLinde它被忽略了,因为标准非常清楚地指出非类类型的rvalue(C++11中的prvalue)不是cv限定的。这可以追溯到C(其中rvalue不是cv限定的,句号)。也就是说:不能有rvalue(prvalue)类型为
int const
,因为这种东西在语言中不存在。@JamesKanze:你是对的,它不存在;我应该在回答之前检查我的假设。@JamesKanze:是的,我知道标准是这么说的,prvalues不能被cv限定是完全有道理的。我只是想提供一个可能的原因来解释为什么命令ITTE决定忽略这些简历限定符,而不是将其定为非法。