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
}