从const成员函数返回非const引用

时间:2011-02-20 05:30:47

标签: c++ pointers reference const

为什么返回对指向成员变量的引用有效,而不是另一个?我知道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;
}

2 个答案:

答案 0 :(得分:19)

int & geta(void) const { return *a; } // good?
int & getb(void) const { return b; }  // obviously bad

在const函数中,每个数据成员都变为const ,使其无法修改int变为const intint *变为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