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
不是最佳实践吗?