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

时间:2011-09-18 06:27:35

标签: 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];
}

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

3 个答案:

答案 0 :(得分:7)

const成员函数中,data的类型从int*更改为int *const

int * const data;

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

data = new int[100]; //error 

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

data[0] = 100; //ok

因为更改内容不会更改指针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];
}

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

答案 1 :(得分:4)

没有办法做你想做的事。您的const成员函数不能更改数据的值(它指向的地址),但没有任何关于不改变它指向的内容,因为您已经注意到了。使用std::vector会有所帮助,因为在const成员函数中你实际上有一个const向量,无法调用它的任何可变函数。

答案 2 :(得分:4)

你应该使用std :: vector的原因实际上是因为你想存储一个int的集合,而不是一个int指针,为什么不使用它呢?

它也可以解决你的常数问题。

以下是它的工作原理:声明一个方法const将使所有类成员成为const。在您的情况下,这意味着在方法范围中,您的成员data将成为指向int的常量指针。这意味着只要data指向同一位置,就可以更改int(也就是数组成员)。使用std::vector,数据将成为const std::vector,您只能在其上调用const函数。是的,您应该使用std::vector