C++ 关于c+中常量的快速说明+;
我知道声明返回类型const的正确方法是: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; 你的理解不正确。上面
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决定忽略这些简历限定符,而不是将其定为非法。