类c ++中的访问器函数

时间:2014-11-13 20:07:06

标签: c++ const accessor

例如,我有一个类的访问函数:

class A {
 public:
 int a; 
 int& getA() const; 
}; 

int& A::getA () const {
 return a;  // error: invalid initialization of reference of type 'int&' from expression of type 'const    //                    int'
 }

问题是: 1.数据成员' a'不是类型' const int',为什么错误?
2.当我将返回类型更改为int时,它也可以。为什么呢?

4 个答案:

答案 0 :(得分:5)

因为您指定getA()const。从声明为const的方法返回对成员变量的非const引用将允许修改引用的值。

如果您想要一个只读访问器,那么只需将访问器声明为

const int& A::getA() const

否则你必须从方法中删除constness。

允许将返回值转换为int,因为您不再返回引用,而是a的副本,因此无法修改原始成员变量。

请注意,您可以同时使用它们:

int& getA() { return a; }
const int& getA() const { return a; }

答案 1 :(得分:2)

错误来自成员函数标记为const的事实。您无法在const方法中返回非const引用,因为调用位置可以修改值:

a.getA() = 2;

当您返回int时,它会复制该值并使上述内容产生编译错误。

答案 2 :(得分:2)

让我们看一下这段代码:

const int *ptr = ...;
int &ref = *ptr; // case 1
int var  = *ptr; // case 2

案例1会编译吗?不,因为ptr是指向常量int的指针,并将其分配给非const引用中断。 “案例2”会编译吗?是的,因为你“复制”,即只从常数中读取值。

现在,在您的情况下,您编写的方法与此相同:

int& getA() const { return this->a; }

您不必明确使用this,但无论如何它都在那里。在方法之后说const基本上使this在该方法中输入const A *。现在,如果您尝试分配(返回类似于分配)this->aint &,则会得到“案例1”,如果您尝试分配给int,则会得到“案例2”上方。

答案 3 :(得分:0)

  

数据成员'a'的类型不是'const int'

const成员函数getA而言,是的。是的 从mutable成员函数的角度来看,所有非const成员都是const。 因此,您尝试将const int绑定到int&

  

当我将返回类型更改为int时,它也能正常工作。为什么呢?

您可以const int复制int中。