使用get函数vs将成员变量设为public

时间:2014-07-22 14:38:41

标签: c++ coding-style

首选的C ++样式是什么,使用getset函数来获取和设置成员变量的值,或者只是将成员变量公开?

class MyClass
{
public:    
    std::string getValue();
    std::string setValue();
private:    
    std::string value; 
};

class MyClass
{
public:
    std::string value;
};

第二个看起来比较干净,我看不出第一个有什么好处,除非你通过代码行付钱给你多一点钱。

3 个答案:

答案 0 :(得分:4)

“展示”对象对世界的勇气是不好的做法。可能以后您可能想要更改类实现,甚至不能使成为std::string

随着项目的发展,许多事情都会发生变化,当然,您可以稍后添加getValue,但在这种情况下,您要弃用旧的“API”并创建新的,这可能会导致更新和等等。

此外,使 public 成员允许用户读取/修改此成员,而无需通知类本身。这可能会造成“糟糕的设计”问题。

答案 1 :(得分:4)

  
    

我认为第一个没有任何优势,除非你通过代码行获得更多的钱。

  

通过这种推理,第二种方法可能会给你更多的钱,考虑到维护成本。

想象一下,有一天你会改变value来计算其他成员。使用getter可以轻松添加此行为,而不会影响代码库。

每个实例中存储string值的事实应该是实现细节,而不是公开可见API的一部分(至少在理论上如此:没有继承,成员存在的事实是可见的)任何用户)。必须编写样板吸气剂和制定者是令人讨厌的,但从长远来看,这是值得的。

通常,具有太多setter和getter对的类具有其他设计缺陷并且通常具有太多可变状态。此外,在C ++中,如果具有数千个getter / setter对的类只保持状态并且根本不定义任何行为,那么它应该是struct

答案 2 :(得分:1)

公共类成员反对封装,这是OO原则之一。

最常见的约定是不使用单词get和set,只使用变量名。我们只是让编译器决定是否设置或通过参数的存在或其缺席来获取。

成员变量应以前缀“m_”开头。

其他选项是使用大写字母启动函数名称,使用常规函数启动变量。

许多开源库(如ImageMagick等)使用此约定。

您的课程应如下:

class MyClass
{
public:
    void value(const std::string& v){
       m_value=v;
     }
    const std::string& value()const {
        return m_value;
     }
private:
    std::string m_value;
};