使用get函数与公开成员变量 什么是首选的C++风格,使用 get < /C>和 SET/COD>函数获取和设置成员变量的值,或者只是使成员变量公共? class MyClass { public: std::string getValue(); std::string setValue(); private: std::string value; };

使用get函数与公开成员变量 什么是首选的C++风格,使用 get < /C>和 SET/COD>函数获取和设置成员变量的值,或者只是使成员变量公共? class MyClass { public: std::string getValue(); std::string setValue(); private: std::string value; };,c++,coding-style,C++,Coding Style,对 class MyClass { public: std::string value; }; 第二个看起来更干净,我真的看不出第一个有什么好处,除非你通过代码行获得更多的钱。向世界“展示”对象的胆量不是一个好的做法。可能以后您会希望更改类实现,甚至使您的值不是std::string 随着项目的发展,许多事情都会发生变化,当然,您可以在以后添加getValue,但在这种情况下,您会弃用旧的“API”并创建新的API,这可能会导致更新等方面的一些问题 另外,使成为public成员允许用户

class MyClass
{
public:
    std::string value;
};
第二个看起来更干净,我真的看不出第一个有什么好处,除非你通过代码行获得更多的钱。

向世界“展示”对象的胆量不是一个好的做法。可能以后您会希望更改类实现,甚至使您的不是
std::string

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

另外,使成为public成员允许用户在不通知类本身的情况下读取/修改该成员。这会造成“糟糕的设计”问题

我真的不认为第一个有什么好处,除了通过代码行获得更多的钱

根据这个理由,第二种方法可能会给您更多的钱,考虑到维护成本

想象一下,有一天您将
值更改为从其他成员计算。有了getter,就可以很容易地添加这种行为,而不会影响代码库

每个实例中都存储有
字符串
值这一事实应该是一个实现细节,而不是公开可见的API的一部分(至少在理论上是这样:没有继承,成员存在的事实对任何用户都是可见的)。必须编写样板文件的getter和setter是很烦人的,但从长远来看,这是值得的


但是,通常情况下,具有太多setter和getter对的类具有其他设计缺陷,并且通常具有太多的可变状态。此外,在C++中,如果一个具有数千个GETTE/SETTER对的类只保留状态,并且不定义任何行为,则应该是Stult。 最常见的约定不是使用get和set,而是使用变量名。我们只是让编译器通过参数的存在或不存在来决定它是被设置还是被获取

成员变量应以前缀“m_3;”开头

另一个选项是以大写字母开头函数名,以正则..开头变量

许多开源库(如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;
};

第一种方法不允许修改。第一种方法的优点是它不公开对象的(可变)实现和私有状态函数,如果我想进行更改。我应该澄清这一点。如果类提供了getter和setter,你必须问它抽象了什么。两者都不好。您应该考虑您的业务模型,并相应地编写您的方法,而不是创建getter和setter。使用
get()
set()
,您将在代码库中得到大量类似
setA(getA()+1)
的代码。但是动态更改实现以计算
value
将呈现setter(它已经是接口的一部分)没用。这是真的-也许塞特从未使用过,可以更安全地移除。但已编辑。@Alex说得很清楚,当你说“有太多setter和getter对的类有其他设计缺陷”时,你的意思并不是说使用getter和setter本身就是一个设计缺陷,对吗?没错。-setter/getter本身很好,但我发现拥有太多setter/getter的类常常同时做太多的事情。我个人喜欢捕获对象中不可变状态的模式(即在对象构造时传递一些状态,并在整个生命周期中保持不变)。在这种情况下,获得者比二传者多得多。YMMV。
甚至使您的值不是std::string
-在这种情况下,使用访问函数有什么帮助?@Gluttton getter可以将类型从内部类型转换为任何其他类型。