C ++私有数据成员访问:良好实践

时间:2013-04-30 11:12:04

标签: 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(const C c1, const C c2);
};

如果在add()我需要访问数据成员,这是最好的方法吗?我应该使用访问函数setget(为客户端程序员创建),或者我可以简单地将数据成员用作自己(c1.ac1.b,{{1 },c2.a)因为我是班级设计师?

4 个答案:

答案 0 :(得分:5)

您可以使用其中之一。这取决于你是否希望你的setter / getters只是那个,或者还有一些额外的功能。例如,getter可能还会更新该成员被访问次数的计数器,因此通过getter访问它们,即使是在类中,也可能更有意义。

无论哪种方式,这都不是设计中最重要的部分。首先需要了解封装的真正含义。让成员private并提供getter和setter并不比首先创建它们public更好(好吧,这对于调试目的而言更好,但从概念上来说它是相同的)。

你真的需要它们吗?

此外,应该const获取getter,您应该通过c1引用传递c2const

答案 1 :(得分:2)

直接使用它。 Set / get用于访问课堂外的成员。

答案 2 :(得分:1)

由于add是类的成员函数,因此您可以直接访问私有数据成员。通常为客户端访问提供设置和获取功能。

答案 3 :(得分:1)

在这个特定的例子中,我只是直接使用变量名。

但是在类似的情况下,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函数时。