据我所知,作为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
答案 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)
我的建议如下: