防止const成员函数更改成员数组

kar*_*doc 3 c++ const

显然,仍允许const成员函数更改类成员指向的数据.这是我的意思的一个例子:

class MyClass
{
public:
  MyClass();
  int getSomething() const;
private:
  int* data;
};

// ... data = new int[10];, or whatever

int MyClass::getSomething() const
{
  data[4] = 3; // this is allowed, even those the function is const
  return data[4];
}
Run Code Online (Sandbox Code Playgroud)

如果不允许这样做,我更愿意.我应该如何定义"数据",以便"getSomething()const"不允许更改它?(但是允许非const函数改变它.)是否有某种"最佳实践"?也许std :: vector?

Naw*_*waz 7

在一个const成员函数的类型,data从改变int*int *const:

int * const data;
Run Code Online (Sandbox Code Playgroud)

这意味着,它是constconst成员函数中的指针,而不是指针指向的数据本身.所以你不能做到以下几点:

data = new int[100]; //error 
Run Code Online (Sandbox Code Playgroud)

因为它试图改变指针本身是const,因此不允许,但允许以下内容:

data[0] = 100; //ok
Run Code Online (Sandbox Code Playgroud)

因为更改内容不会更改指针.data指向相同的内存位置.

如果你使用std::vector<int>,那么你可以实现你想要的.事实上,vector解决了这个问题,连同内存管理问题,因此使用它:

class MyClass
{
public:
  MyClass();
  int getSomething() const;
private:
  std::vector<int> data;
};

MyClass::MyClass() : data(10) {}  //vector of size 10

int MyClass::getSomething() const
{
  data[4] = 3; // compilation error - this is what you wanted.
  return data[4];
}
Run Code Online (Sandbox Code Playgroud)

尽可能避免非RAII设计.RAII是内存管理问题的优秀解决方案.在这里,通过它,您可以实现您想要的.读这个: