Eve*_*one 14 c++ getter encapsulation private-members getter-setter
我们都同意公共变量不利于封装以及所有这些.但是,我注意到有很多代码可以执行此类操作:
class foo {
private:
int integer_;
string someString_;
// other variables
public:
int& integer() { return integer_; }
string& someString() { return someString_; }
// other "functions"
}
int main() {
foo f;
f.integer() = 10;
f.someString() = "something";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经看到这在许多地方被使用,我不明白为什么.基本上它返回对数据的引用,从而将其直接暴露给外部.所以封装并没有真正实现,不是从任何角度来看.
为什么这个常用?
πάν*_*ῥεῖ 16
有一个反复出现的口头禅,应该使用getter/setter函数来封装你的数据.因此,许多(没有经验或咖啡超载)程序员得到他们应该使用的东西:
int& integer() { return integer_; }
Run Code Online (Sandbox Code Playgroud)
但这与简单写作没有太大区别:
class foo {
public: // <<<
int integer_;
string someString_;
// ...
};
Run Code Online (Sandbox Code Playgroud)
好吧,它添加了一个函数调用,但是你无法控制客户端对引用的作用.
如果你真的想提供一个getter函数写:
const int& integer() const { return integer_; }
Run Code Online (Sandbox Code Playgroud)
相应的setter函数如下所示:
void integer(const int& value) {
integer_ = value;
}
Run Code Online (Sandbox Code Playgroud)
我必须部分地同意@πάνταῥεῖ和@Rakete1111的答案,考虑一个类的定义是如何随着时间的推移而演变的.
虽然这些getter方法通常是由刚刚听过"没有暴露成员"口头禅的人写的,但它们也可以合法使用:
vector<bool>运作; 当你打电话给它时,operator[]你没有得到它boolean&,你得到某种代理,当分配或分配时,它会进行适当的位提取或设置.总结:"虚拟"非const-reference getter可以是其他有意义的代码的存根.
话虽这么说,让getter返回const引用或值通常是一个好主意.或者只是在适当的情况下暴露场地(也有一些场景).