C++ C++;私有数据成员访问:良好实践
假设我们处于这种情况:C++ C++;私有数据成员访问:良好实践,c++,class,C++,Class,假设我们处于这种情况: class C { int a, b; public: C(int aa, int bb) { setA(aa); setB(bb); } void setA(int aa) { a = aa; } int getA() { return a; } void setB(int bb) { b = bb; } int getB() { return b; } C add(con
class C {
int a, b;
public:
C(int aa, int bb) {
setA(aa);
setB(bb);
}
void setA(int aa) { a = aa; }
int getA() { return a; }
void setB(int bb) { b = bb; }
int getB() { return b; }
C add(const C c1, const C c2);
};
如果在
add()?我应该使用访问函数set
和get
(为客户端程序员创建),或者我可以简单地使用数据成员作为自己(c1.a
,c1.b
,c2.a
,c2.b
),因为我是类设计者?直接使用它。Set/get用于从类外访问成员。您可以使用其中一种。这取决于您是希望setter/getter就是这样,还是希望它具有一些附加功能。例如,getter还可能更新该成员被访问次数的计数器,因此通过getter(甚至在类内部)访问它们可能更有意义
不管怎样,这都不是设计中最重要的部分。您首先需要理解封装的真正含义。让成员私有化
并提供getter和setter并不比首先让它们公共化
好多少(好吧,为了调试的目的,这是一个痛苦的好办法,但从概念上来说是一样的)
你真的需要它们吗
此外,getter应该是const
,您应该通过const
引用传递c1
和c2
。因为add是类的成员函数,所以您可以直接访问私有数据成员。通常,set和get函数是为客户端访问提供的。在这个特定示例中,我只需直接使用变量名
但在类似的情况下,getter/setter更有用
例如,当setter(或getter)函数比普通的x=y
更复杂时:
void SetA(int aa){ //a between 0 and 100
a = std::max(0, std::min(aa, 100));
}
或者,当您想要子类化C
并重载getter/setter或add
函数时。您是否计划在构造函数中使add
虚拟
?无需调用set函数。直接设置a=aa
和b=bb
@Koushik So。他做的事没有违法之处。(有几个问题值得商榷,比如带三个参数的add
函数,或者在忽略const
的上下文中的const C
,或者在这个问题上,所有成员都有getter和setter。)@JamesKanze我意识到了这一点。谢谢。@unNaturhal:我只提到了我想说的一部分:如果这些函数中的任何一个是virtual
,例如add
的行为可以在派生类中以最小的摩擦进行更改。如果使用直接访问成员变量的方法,例如add
,这将非常容易。将成员设置为私有并提供getter和setter并不比首先将其公开好多少…
如何在不使用getter的情况下访问私有成员?友谊?但是友谊打破了封装
!我不明白你的观点。@Mushy如果它们是公开的,你可以直接访问它们。我的观点是,私有成员加上getter和setter也会破坏封装。如果它们是private
,那么如果它们不使用getter
,或者不使用setter
修改它们,又如何访问它们呢?如果封装一个字段
并不比公开成员、排除友谊更好,那么他们是如何访问的?@Mushy将一个字段设置为私有,但仍然允许访问get或set,这并不提供封装。这就是我的观点。OP正在寻找访问私人成员时的良好实践。在我看来,您似乎同意getters
是访问私有成员的方法,但接着又指出它破坏了封装,而没有提供一种替代方法。我想知道什么访问方法不会破坏封装
?因此,getter/setter
不是最佳实践吗?