假设我们有一个类A
:
class A {
private:
int* v;
public:
A() {
v = new int;
*v = 7;
}
int* get() {
return v;
}
};
并且有代码main()
:
int main() {
A* a = new A();
std::cout << *(a->get()) << "\n";
int* v1 = a->get();
*v1 = 3;
std::cout << *(a->get());
return 0;
}
7
执行后,将显示3
。v
因此,我通过这种方式更改了类的私有字段指向的值A
,因此我破坏了封装。在这个例子中,使用指针是多余的,但是,如果我想在堆上存储任何对象,我将不得不使用指针。
问题:如何组织一个类A
以便在堆上存储一个值,返回它(不是副本),同时不能改变这个值,而不是通过类方法A
(通过方法A
,值必须是可变的(常量将不行))?
你为什么要返回一个指针值呢?存储值的方式和位置取决于您。那我该怎么办
好吧,如果你迫切需要返回一个指针,那么就意味着客户端 必须直接使用指针,那么我们可以谈论什么样的封装呢?
const int*
const
在 getter 中,使用限定符返回对对象的引用并将相同的限定符应用于方法本身是有意义的。因此,调用代码将可以访问存储的对象而无法更改它,并且该方法也可以在不可变的存储对象上调用: