返回对const类型的const指针的引用

时间:2017-04-10 14:10:37

标签: c++ pointers

您能看一下这个示例代码:

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,它编译得很好。

1 个答案:

答案 0 :(得分:1)

首先考虑const int& GetB()。这是一种返回对类成员b的引用的简洁方法,无法在呼叫站点进行修改。您也可以标记该函数const,因为您没有更改任何类成员数据。这是惯用的C ++,特别是对于大于int的类型,例如std::string

当您编写return a;时,您允许函数调用站点通过该指针修改该类成员。虽然C ++标准允许这样做,但它绕过了封装,你友好的编译器会警告你。请注意,由于函数本身是而不是更改类成员,因此编译通过,尽管它被标记为const

在编写const int * const& c = a;时,编译器假定您知道自己在做什么。

(作为最后一点,如果你因为编译器生成的拷贝构造函数浅拷贝Test而试图复制a的实例,那么所有的破坏都会松动。你应该{{1}复制构造函数和赋值运算符。)