C++通过ref返回成员的方法和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
  • 这两种访问私人会员的方式有什么区别
  • 如果我所需要的只是不在这些函数中执行任何其他操作即可获取或设置

使用set_name,您可以对输入执行验证,并在必要时抛出异常。您也可以同时更新任何其他类成员。

如果返回引用,则会失去对可以设置的内容的控制,因为可以通过引用修改成员。事实上,正如您所指出的,您还可以将成员变量public。

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

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函数中进行同步,类本身可以处理同步,而不必担心数据争用。

我的建议如下:

  1. 如果你的类只是自变量的集合(例如3矢量的尺寸或人的姓名、出生日期和地址)然后只使用公共成员
  2. 如果你的班级必须保留一些不变量(例如,一个日期中允许的天数取决于年份和month)使用私有成员和公共setter/getter方法强制执行这些不变量
  3. 有时,您还希望只允许读取或写入访问,或者您有"模拟"属性,这些属性不直接映射到特定的成员变量,而是根据它们计算的。在这些情况下,您显然还需要单独的setter和getter方法(或者只需要其中之一)
  4. 最后,据我所知,你想回来的唯一常见情况对私有变量的非常数引用位于容器中,其中通过元素的索引或键来访问该元素

相关内容

  • 没有找到相关文章

最新更新