为什么返回对指向成员变量的引用有效,而不是另一个?我知道const
成员函数应该只返回const
个引用,但是为什么对于指针来说这似乎不正确呢?
class MyClass
{
private:
int * a;
int b;
public:
MyClass() { a = new int; }
~MyClass() { delete a; }
int & geta(void) const { return *a; } // good?
int & getb(void) const { return b; } // obviously bad
};
int main(void)
{
MyClass m;
m.geta() = 5; //works????
m.getb() = 7; //doesn't compile
return 0;
}
答案 0 :(得分:19)
int & geta(void) const { return *a; } // good?
int & getb(void) const { return b; } // obviously bad
在const函数中,每个数据成员都变为const ,使其无法修改。 int
变为const int
,int *
变为int * const
,依此类推。
由于您的第一个函数中a
的类型变为int * const
,而不是const int *
,因此您可以更改数据(可修改) :
m.geta() = 5; //works, as the data is modifiable
:const int*
和int * const
之间的区别。
const int*
表示指针是非const ,但指针指向的数据是 const 。int * const
表示指针为 const ,但指针指向的数据为非常量。您的第二个函数会尝试返回const int &
,因为b
的类型变为const int
。但是您已经在代码中提到了int &
的实际返回类型,因此无论您在{{{{}} 1}},因为返回类型不匹配。这是修复:
main()
现在this。
答案 1 :(得分:6)
因为a
变为int * const a;
。也就是说,您无法更改a
的值(更改其指向的内容),就像const
所说的那样。 a
指向的常量是一个完全不同的问题。
有关const和const成员函数的详细讨论,请参阅我的回答here。