【问题标题】:C++ Difference between method returning member by ref and get-set methodC ++通过ref和get-set方法返回成员的方法之间的区别
【发布时间】:2015-03-21 08:43:49
【问题描述】:

据我所知,作为 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
  • 这两种访问私有成员的方式有什么区别?
  • 如果我所需要的只是 在这些函数中获取或设置而不执行任何其他操作?

【问题讨论】:

  • 这没什么大的区别。但是如果你使用 getter 和 setter,你可以验证值并尽可能做一些工作。如果你使用 public 成员,当你需要在 get 或 set 时添加一些代码时,你将不得不修改所有的 refs。
  • getter/setter 方法允许您更改类的内部表示并保持不变量。

标签: c++ get set


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    当您使用 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 中进行同步,类本身会处理同步,您不必担心数据争用。

    【讨论】:

      【解决方案3】:

      我的建议如下:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-14
        • 2020-06-25
        • 2021-07-15
        • 1970-01-01
        • 2019-04-14
        • 1970-01-01
        • 2018-01-07
        相关资源
        最近更新 更多