您能看一下这个示例代码:
class Test {
int *a;
int b;
public:
Test() : b(2)
{
a = new int(5);
}
const int * const& GetA() const
{
const int * const& c = a;
return a;
}
const int& GetB()
{
return b;
}
~Test()
{
delete a;
}
};
我收到回复的警告a。为什么返回对const变量的const指针的引用是错误的,但是返回对const变量的引用是没关系的?顺便说一句,如果我在GetA()中返回c,它编译得很好。
答案 0 :(得分:1)
首先考虑const int& GetB()
。这是一种返回对类成员b
的引用的简洁方法,无法在呼叫站点进行修改。您也可以标记该函数const
,因为您没有更改任何类成员数据。这是惯用的C ++,特别是对于大于int
的类型,例如std::string
。
当您编写return a;
时,您允许函数调用站点通过该指针修改该类成员。虽然C ++标准允许这样做,但它绕过了封装,你友好的编译器会警告你。请注意,由于函数本身是而不是更改类成员,因此编译通过,尽管它被标记为const
。
在编写const int * const& c = a;
时,编译器假定您知道自己在做什么。
(作为最后一点,如果你因为编译器生成的拷贝构造函数浅拷贝Test
而试图复制a
的实例,那么所有的破坏都会松动。你应该{{1}复制构造函数和赋值运算符。)