例如,我有一个类的访问函数:
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时,它也可以。为什么呢?
答案 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->a
到int &
,则会得到“案例1”,如果您尝试分配给int
,则会得到“案例2”上方。
答案 3 :(得分:0)
数据成员'a'的类型不是'const int'
就const
成员函数getA
而言,是的。是的
从mutable
成员函数的角度来看,所有非const
成员都是const
。
因此,您尝试将const int
绑定到int&
。
当我将返回类型更改为int时,它也能正常工作。为什么呢?
您可以将const int
复制到int
中。