繁体   English   中英

自由函数与成员函数

[英]Free function versus member function

拥有一个自由函数(在匿名命名空间中并且只能在单个源文件中访问)并将所有变量作为参数发送,而不是拥有一个没有任何参数的私有类成员函数并直接访问成员变量有什么好处?

标题:

 Class A {
    int myVariable;
    void DoSomething() {
       myVariable = 1;
    }
 };

来源:

 namespace {
    void DoSomething2(int &a) {
        a = 1;
    }
 }

 int A::SomeFunction() {
    DoSomething2(myVariable); // calling free function
    DoSomething(); // calling member function
 }

如果您更喜欢让它们成为成员,那么如果我首先调用一个未访问任何成员变量的函数,但该函数调用另一个正在访问成员的函数,该怎么办。 它们都应该是成员函数还是免费的?

看到这个问题: Effective C++ Item 23 Prefer non-member non-friend functions to member functions and also C++ Member Functions vs Free Functions

您应该更喜欢自由函数,因为它会促进松散耦合。

仅当它适用于您的类的内部并且您认为它确实与您的类紧密相关时,才考虑将其设为成员函数。

这是101 C++ 编码标准一书中的一个观点,它指出比成员函数更喜欢自由函数和静态函数。

尽管这可能被认为是基于意见的,但它允许保持类很少,并分开关注。

这个答案指出:“这条规则的原因是,通过使用成员函数,你可能会意外地过度依赖类的内部结构。”

源文件中非成员函数的一个优点类似于Pimpl 惯用法的优点:如果您更改实现,使用您的头文件的客户端不必重新编译。

// widget.h
class Widget 
{
public:
    void meh();
private:
    int bla_;
};

// widget.cpp
namespace {
    void helper(Widget* w) // clients will never know about this
    { /* yadayada */ }
}

void widget::meh() 
{ helper(this); }

当然,这样写的时候, helper()只能使用Widget的公共接口,所以收益不大。 您可以将helper()friend声明放在Widget但在某些时候您最好切换到成熟的 Pimpl 解决方案。

自由函数与成员函数的主要优势在于它有助于将接口与实现分离。 例如, std::sort不需要知道它所操作的底层容器的任何信息,只要它被授予对提供某些特征的容器的访问权(通过迭代器)。

在您的示例中, DoSomething2方法对减少耦合没有太大作用,因为它仍然必须通过引用传递来访问私有成员。 几乎可以肯定,在普通的DoSomething方法中进行状态突变更明显。

当您可以根据类的公共接口实现任务或算法时,就很适合制作免费功能。 Scott Meyers 在这里总结了一套合理的规则: http : //cpptips.com/nmemfunc_encap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM