C ++通过ref和get-set方法返回成员的方法之间的区别

时间:2015-03-21 08:43:50

标签: c++ get set

据我所知,作为C ++的新角色,两者都打算将私人会员公开给公众。我们可以这样说:

// Make everything outside can see value of name
object.get_name(); // get method
object.name();     // return member by ref to get

// Make everything outside can set value of name
object.set_name("Name"); // set method
object.name() = "Name";  // return member by ref to set
  • 这两种访问私有成员的方式有什么区别?
  • 如果我只需要的话,为什么不打算只创建一个公共成员呢? 获取或设置而不在这些函数中做任何其他事情?

3 个答案:

答案 0 :(得分:1)

使用set_name,您可以对输入执行验证,并根据需要抛出异常。您还可以同时更新任何其他班级成员。

如果返回引用,则无法控制可以设置的内容,因为可以通过引用修改成员。实际上,正如您所指出的那样,您可以将成员变量公之于众。

答案 1 :(得分:1)

使用set函数时可以有更多的控制权,而不是返回对内部类成员的引用(输入验证,抛出异常等)。

class Foo{
    std::string name;
public:
    const std::string& get_name() const;
    void set_name(const std::string&); // perform input validation inside set_name
};

如果您通过返回对它的引用的公共函数公开类成员,那么您首先删除了它成为私有的目的。

此外,如果在多个线程之间共享对象,则可能需要同步对对象状态的访问。为此,您通常会在对象的函数中锁定互斥锁。

class Foo{
    mutable std::mutex mtx; // mutable so that it can be modified in const-qualified functions
    std::string name;
public:
    std::string get_name() const
    {
        std::lock_guard<std::mutex> lg{mtx};
        return name;
    }

    void set_name(const std::string& str)
    {
        std::lock_guard<std::mutex> lg{mtx};
        name = str;
    }
};

通过在get / set-functions中进行同步,类本身可以处理同步,而无需担心数据争用。

答案 2 :(得分:0)

我的建议如下:

  1. 如果你的班级只是一个独立变量的集合(例如3 矢量或名称的尺寸,出生日期和人的地址) 然后只使用公共成员。
  2. 如果你的班级必须维持一些 不变量(例如,日期中允许的天数取决于年份和 月)使用私有成员和公共setter / getter方法 强制执行那些不变量。
  3. 有时,您还希望仅允许读取或仅允许写入权限,或者您已经模拟了&#34;属性,不直接映射到特定成员变量,但是从它们计算。在这些情况下,您显然还需要单独的setter和getter方法(或者只有其中一个)。
  4. 最后,唯一常见的情况 - 我知道 - 你想要回归 私有变量的非const引用在容器中,其中 您通过索引或键访问元素。