C++;私有函数:是否按函数参数传递类成员变量 这是C++类实现中一次又一次出现的问题。我很好奇这里人们的想法。您喜欢哪种代码?为什么 class A { public: /* Constructors, Destructors, Public interface functions, etc. */ void publicCall(void); private: void f(void); CMyClass m_Member1; };

C++;私有函数:是否按函数参数传递类成员变量 这是C++类实现中一次又一次出现的问题。我很好奇这里人们的想法。您喜欢哪种代码?为什么 class A { public: /* Constructors, Destructors, Public interface functions, etc. */ void publicCall(void); private: void f(void); CMyClass m_Member1; };,c++,function,private-methods,C++,Function,Private Methods,与 或者另一种选择: class A { public: /* Constructors, Destructors, Public interface functions, etc. */ void publicCall(void); private: void f(CMyClass &x); CMyClass m_Member1; }; 与 我想我总是更喜欢第二个,因为f可以对CMyClass的任何实例进行操作,但是,我有很多代码,其中第一个是完

或者另一种选择:

class A
{
public:
    /* Constructors, Destructors, Public interface functions, etc. */ 
    void publicCall(void);

private:
    void f(CMyClass &x);

    CMyClass m_Member1;
};

我想我总是更喜欢第二个,因为
f
可以对
CMyClass
的任何实例进行操作,但是,我有很多代码,其中第一个是完全有效的,因为
f
只会对
m_Member1
进行操作,我将它分成两个函数,以使代码更具可读性

是的,这更像是一个讨论问题,而不是一个“答案”问题,但我更感兴趣的是推理。我会将给出良好推理或标准的回答标记为答案


此外,请记住,这只是一个玩具的例子。在现实中,类会比这更大,因此组织是重要的。

问问自己:用
m_Member1
以外的对象调用
f()
是否有意义,或者在可预见的未来是否有意义

如果答案是:

  • 。执行无参数的
    f()
    ,因为
    m\u成员1
    a
    的固有部分
  • 。执行
    f(CMyClass&)
    。即使现在只使用
    mumember1
    ,这也不是您处理的类的固有属性
  • 也许。好。。。我会说使用无参数的
    f()
    。总是有改变你想法的选择(事实上,这种改变很微小)

还请注意,函数
f()
可以调用另一个函数
g(CMyClass&)
,但不能反过来调用。因此,取决于
f()
的功能,这可能会限制您的选择。

既然您是在征求意见,如果独立的
f(CMyClass&)
函数有意义并且是可实现的,那么我也会支持该选项。如果
f
执行的操作仅在A类上下文中有意义,如果
CMyClass
仅在A的上下文中有意义,或者如果它依赖于
A
的其他属性,我会选择第一种情况。我认为必须根据问题来决定。

在第二个示例中,作为
的静态函数或全局函数,或者可能是
CMyClass的成员函数,不是更好吗

当然,在某些情况下,您最好在每次调用该函数时发送参数,但是当您在A对象中已经有on CMyClass对象时,为什么要重新发送它呢。如果需要两个CMyClass对象进行交互,最好将其添加到
CMyClass
成员函数列表中,而不是添加到
A


另外,正如前所述,使用不带任何参数的函数比使用带参数的函数更好。当另一个程序员试图读取函数时,它必须破译/注意函数名之外的第二个参数。

我会根据上下文给出答案。如果现在或将来某一天f可能会对多个成员变量实例进行操作,那么一定要将其作为参数传递。然而,如果f对A实例状态的特定元素进行操作,我不会向它传递任何信息。在很多情况下,A中总是只有一个foo。在这一点上,将foo作为f的参数是愚蠢的。效率稍低,除非f是内联的,因为传递的不仅是this指针,还有foo的地址,它是堆栈上的一个额外副本。

一如既往,这取决于。每种情况都不同

在您给出的具体示例中-首先,我将排除您的选择(
void A::f(CMyClass&x)
),主要是因为它“闻起来”很难闻(正如Martin Fowler所说)。它是一个私有函数,除非您现在需要在其他实例中使用它,否则请让它使用成员。如果需要,您可以随时重构它

想象一下如果
f
有两个参数会发生什么。3个参数。10那么,每次发送它们有意义吗?有这些参数成员不是更好吗

如果
f
必须将其中一些参数发送给
A
的其他方法,该怎么办?使用成员是否更有意义


所有这些都是假设
f
确实需要
A
保存的其他信息,否则我会将其移动为
CMyClass

的方法。在第二种情况下,您可以将
f
设置为静态,它将创建与第一种情况几乎相同的代码。@Kerrek SB,这是事实,也是一个很好的观点。实际上,没有理由
f()
甚至需要成为这个类的成员。它可以是它自己的独立实用功能。现在只需说明,
f()
除了在这个类的上下文中没有特别的用处。为什么第一个f不能在CMyClass的任何实例上操作?然后将
f
定义为一个仅在实现文件中可见的免费帮助函数。@KerrekSB-除非
f()
需要类的其他成员
a
。诚然,它可以将所有这些都作为参数接收,但这可能并不容易。+1,但我将以健康辩论的精神对你所说的几部分内容提出质疑(主要是因为我需要理由):如果你的问题的答案是“否”,那么你为什么更喜欢
f()
?另外,为什么您似乎更喜欢无参数的
f()
?我猜你的最后两句话在这里给出了一些理由……首先,因为如果
m_Member1
被认为是
a
的一个独特部分(例如
头部
主体的一部分),那么
f()
可以被解释为对
的操作
class A
{
public:
    /* Constructors, Destructors, Public interface functions, etc. */ 
    void publicCall(void);

private:
    void f(CMyClass &x);

    CMyClass m_Member1;
};
void A::publicCall(void)
{
    f(m_Member1);
}

void A::f(CMyClass &x)
{
    // do some stuff to populate x, 
    // locally masking the fact that it's really m_Member1
}