struct
我试图使成员变量可访问,但只能通过界面读取。目前我已尝试过这种方法,似乎编译得很好。我为原始变量class A{
private:
int a;
public:
const int &ref = a;
};
int main() {
A obj;
obj.a = 20; // error cause private
obj.ref = 30; // not private but const so ERROR
return 0;
}
制作了const reference
并将其设为int a
。我可能会错过这种做法有什么不对吗?或者这个例子在实际应用中是否安全可靠?
提供具有public
正确性的成员函数没有错(我也一直使用它并且打算一直这样做),但是我问这是否有任何问题如果我必须提供只读的变量。
谢谢你:)
答案 0 :(得分:4)
class A{
private:
int a;
public:
const int &ref = a;
};
如果我必须提供一个只读的变量
,这种方式是否有任何问题
这个类A
的设计决定至少存在一些缺点。
同样提及Dieter Lücking comment:
不必要地增加班级的规模
它打破了编译器生成的复制赋值运算符。例如,通常需要以下代码行为,但不起作用。
A obj1;
// ...
A obj2;
// make changes to 'obj2'
// Update 'obj1' with the changes from 'obj2'
obj1 = obj2; // This copy doesn't work!
更多信息:
使用引用时有一些规则:
- 创建时必须初始化引用。 (指针可以随时初始化。)
- 一旦将引用初始化为对象,就无法将其更改为引用另一个对象。 (指针可以随时指向另一个对象。)
- 您不能拥有NULL引用。您必须始终能够假定引用已连接到合法的存储区。
醇>
可能有可能实现自定义赋值运算符,但是需要维护更多代码(即我认为的另一个缺点)。
#include <iostream>
class A
{
private:
int a;
public:
explicit A(int value) : a(value) {}
A& operator=(const A& other)
{
a = other.a;
return *this;
}
const int& ref = a;
};
int main()
{
A obj1(10);
std::cout << "1: " << obj1.ref << "\n";
A obj2(20);
std::cout << "2: " << obj2.ref << "\n";
obj1 = obj2;
std::cout << "1: " << obj1.ref << "\n";
return 0;
}
解决此问题的惯用方法是使用适当的访问器功能。
class A {
private:
int a;
public:
int getA() const { return a; }
};
答案 1 :(得分:3)
在C ++中执行此操作的标准方法是将实际成员private
包括在内,但包括公开的&#39; getter&#39;接口的方法如下:
class A{
private:
int a;
public:
int get_a() const { return a; }
A() : a(20) {}
};
int main() {
A obj;
int n = obj.get_a(); // n = 20
return 0;
}
用户无法设置A::a
的值,但可以使用A::get_a
来检索其值。