【发布时间】:2019-05-10 00:25:48
【问题描述】:
我正在通过 Stroustrup 的(使用 C++ 的编程原理和实践)一书学习 C++。在练习中,我们定义了一个简单的结构:
template<typename T>
struct S {
explicit S(T v):val{v} { };
T& get();
const T& get() const;
void set(T v);
void read_val(T& v);
T& operator=(const T& t); // deep copy assignment
private:
T val;
};
然后要求我们定义一个 const 和一个非 const 成员函数来获取 val。
我想知道:在任何情况下让非常量 get 函数返回 val 有意义吗?
在我看来,我们不能在这种情况下间接地改变价值。哪些用例需要 const 和非 const get 函数来返回成员变量?
【问题讨论】:
-
IMO 甚至更清洁的人根本不会是 getter 或 setter,而是让课程与行为有关。如果您有成员变量的 getter 和 setter,您不妨将其设为
public。 -
使用非常量 get 成员函数(或任何 getter 和 setter 反模式)的主要原因是避免进行正确的面向对象编程。
-
@Someprogrammerdude 不是真的。也许现在该字段只是一个普通值,但您知道当您要迭代开发新需求时,它必须是一个计算值,因此拥有一个 getter 可以避免更改访问该字段的所有代码。另外:拥有一个 getter,您可以轻松在其上添加断点,并在调试器中检查访问它的代码在哪里。如果您只有一个字段,则必须在访问该字段的每个地方都放置断点,这会比较麻烦。
-
一个 const getter 是有意义的private 允许仅通过构造函数和 setter 进行修改(这将保证不变量)。一般来说,根据我的经验,setter 和 getter,尤其是非常量 getter,通常是口头和书面传统的结果,而不是针对特定案例的特定想法的结论。但是,请注意,Stroustrup 的示例是一个通用案例,旨在简单地介绍这个想法。
-
@Bakuriu 我猜 Some 指的是其他访问私有字段的类首先是糟糕的设计。只是一个愚蠢的例子:糟糕的设计是有一个
customer::getMoney()和customer::setMoney(int),而实际上它应该是一个customer::pay(int)。pay涵盖了您所有的问题,而且您不会破坏封装
标签: c++ constants getter member-functions