显然,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?
答案 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
。