我想提供不同级别的const访问权限'我的数据。例如,取决于是否应修改指针或数据。所以这就是我提出的:
class MyClass
{
int n;
int* ptr_to_data;
int* const const_ptr_to_data;
const int * ptr_to_const_data;
public:
MyClass(int nn)
: n(nn),
ptr_to_data(&n),
const_ptr_to_data(ptr_to_data),
ptr_to_const_data(ptr_to_data)
{
}
~MyClass() { }
int& get_data()
{
return *const_ptr_to_data;
}
const int& get_data() const
{
return *ptr_to_const_data;
}
};
这里的目标是通过限制尽可能多的访问来避免程序员错误。这是一个很好的方法,如何让它变得更好?
答案 0 :(得分:6)
你有两个get_data
函数的正确方法,但所有的指针只会让代码更难维护。这就足够了:
int& get_data() { return n; }
const int& get_data() const { return n; }
答案 1 :(得分:2)
您存储的指针对访问问题没有帮助,正如您将看到的那样,但是当您复制对象时,它们将引用错误实例中的数据,除非您负责复制。顶级const
可防止为类实例分配。即指针是有问题的,并没有任何好处。
而是这样做:
int data() const
{
return n_;
}
void set_data( int const value )
{
n_ = value;
}
或者您可以像在标准库中那样使用data
来设置setter,但命令式表单在调用代码中更具可读性。
此方法的一个关键功能是不会传递指向非const
数据成员的指针或引用。
因为通过传递不受限制的引用或指针,您将失去对该数据成员更改的所有控制权,特别是在维护类不变量,可能是其他相关值,强加范围限制,检查何时进行更改等等方面