C++ - 在内部,当定义一个类的成员函数时,应该使用成员变量名称还是它的 getter 函数?

Posted

技术标签:

【中文标题】C++ - 在内部,当定义一个类的成员函数时,应该使用成员变量名称还是它的 getter 函数?【英文标题】:C++ - Internally, when defining a class's member functions, should the member variable name or its getter function be used? 【发布时间】:2015-10-25 00:41:20 【问题描述】:

如果问题标题没有有效(或根本)反映我的实际问题,我深表歉意;这是我第一次在 *** 上提问或回答,可能搞错了……

无论如何,我的(详细)问题是这样的:

在需要使用私有成员变量的类中定义公共成员函数时,每个变量(私有变量)都具有公共成员“getter”函数(请不要回答说“失去 getter/setter...”,我正在使用它们),它会更好吗——实际上是“更好”,比如这使得类在 C++ 编译器之间更“可扩展”,哪个选项允许更多“前向兼容性”——使用 this->m_variable 或使用 this->getm_variable()?

我从我目前正在从事的项目中包含以下代码示例(创建一个名为 Family 的类),以尝试阐明我的意思:

Family.h 片段

private:
    Person* children; // array of Person objects - Person is a member struct
    size_t numChildren;

public:
    enum gender  NONE = 0, MALE, FEMALE 
    size_t countChildren()  return numChildren; 
    size_t countChildren(gender g);
    Person* getChild()  return children; 

Family.cpp 片段

// this is the specific function example:
size_t Family::countChildren(gender g) 
    for (size_t i = 0; i < this->numChildren; i++) 
        ...CODE TO COUNT CHILDREN OF SPECIFIED GENDER...
    
    return # of children with gender g   // pseudocode, obviously...

所以,现在为示例更改问题:

countChildren(gender g) 函数的定义中,我有i &lt; this-&gt;numChildren; 使用i &lt; this-&gt;countChildren(); 会更好(就我之前所说的指标而言)? 同样,在为同一个 for 循环遍历 children 数组时,在当前迭代中使用 *(this-&gt;children + i) 或使用 *(this-&gt;getChild() + i); 定义每个 Person* 会更好吗?

提前感谢您的帮助,如果这个问题对于 *** 来说过于“基于讨论”,我深表歉意,正如我之前提到的,这是我第一次提出问题。

【问题讨论】:

我不太明白;您的意思是“我应该通过变量还是吸气剂在内部引用成员”? (另外,欢迎您,您已经比那些要求家庭作业解决方案的人做得更好了!) 谢谢,是的,这正是我的意思。我试图快速编辑标题以更好地反映我的问题的目的。 【参考方案1】:

在理想情况下,您总是会在内部使用 getter 来引用逻辑属性。这仅在所述属性要公开公开时才真正重要;如果您发现自己编写了一个仅用于实现细节的private getter,请停止编码并喝杯咖啡,然后想想您在做什么。

为什么在内部使用 getter? 出于同样的原因,您会在其他任何地方使用它们;他们对班级代表的变化更具弹性。除了这一次,受益的不仅仅是其他代码,还有这个类。

通过扩展,这使得扩展类变得更加容易。 如果您希望 countChildren 是纯虚拟的,该怎么办(或者 abstract,如果您更喜欢 Java),并让不同的子类决定如何计算子类? (并不意味着你总是应该,但你可以。That's a separate issue, though.)

不要说“函数调用对性能的影响”。这可能会被优化,特别是如果 getter 是inline 或非virtual

在实际世界中,这是否真的重要取决于有多少其他人会使用您的代码,或者是否知道您的类的数据表示不太可能改变(这有时实际上是一个合理的期望,例如数学向量)。

【讨论】:

【参考方案2】:

我个人的偏见:使用成员函数而不是成员变量。如果您决定以不同的方式表示成员变量,或者使用 Pimple idiom 将其移动到帮助程序类中,您将需要修改的代码更少。

【讨论】:

以上是关于C++ - 在内部,当定义一个类的成员函数时,应该使用成员变量名称还是它的 getter 函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++--类与封装

C++学习摘要之二:构造函数和析构函数

从 C++ dll 导出一个类?

C++ (P70—)

使用在内部结构定义中保存函数的类成员变量,这些函数将用作 unordered_map 对象的模板参数

类_类的定义