自由功能与成员功能

时间:2014-01-09 18:55:37

标签: c++ dependencies member-functions pimpl-idiom non-member-functions

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

头:

 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 fucntion
 }

如果您更喜欢将它们作为成员,那么如果我有一个案例,我首先调用一个不访问任何成员变量的函数,但该函数调用另一个访问成员的函数。它们既可以是会员功能还是免费的?

3 个答案:

答案 0 :(得分:12)

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

// 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的公共界面,所以你获得的收益很少。您可以在friend内添加helper() Widget声明,但在某些时候您最好切换到成熟的Pimpl解决方案。

答案 1 :(得分:10)

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

你应该更喜欢自由功能,只要它促进松耦合。

只有当它在你班级的胆量上工作时,才考虑将它变成一个成员函数,并且你认为它真的与你的班级有关。

这是 101 C ++编码标准这本书的一点,它指出自由功能和静态功能优于成员函数。

尽管这可能被认为是基于意见的,但它可以使课程变得很少,并且可以分开关注。

这个answer说:“这个规则的原因是,通过使用成员函数,你可能会偶然依赖于类的内部。”

答案 2 :(得分:5)

自由函数与成员函数的主要优点是它有助于将接口与实现分离。例如,std::sort不需要知道关于它运行的底层容器的任何,只是它可以访问提供某些特性的容器(通过迭代器)。

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

当您可以根据类的公共接口实现任务或算法时,这使得它成为创建自由函数的良好候选者。 Scott Meyers在此总结了一套合理的规则:http://cpptips.com/nmemfunc_encap