自由功能与成员功能

Jan*_*ana 17 c++ dependencies pimpl-idiom member-functions non-member-functions

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

标题:

 Class A {
    int myVariable;
    void DoSomething() {
       myVariable = 1;
    }
 };
Run Code Online (Sandbox Code Playgroud)

资源:

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

 int A::SomeFunction() {
    DoSomething2(myVariable); // calling free function
    DoSomething(); // calling member fucntion
 }
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*and 12

看到这个问题:有效的C++项目23首选非成员非友元函数到成员函数 以及C++成员函数与自由函数

你应该更喜欢自由函数,在它促进松散耦合的范围内.

考虑将它作为一个成员函数,只要它适用于你的类的胆量,并且你认为它真的与你的类紧密相关.

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

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

这个答案指出:"这个规则的原因是,通过使用成员函数,你可能会意外地依赖于类的内部."

  • 不确定我明白你的意思.我会用这种方式纠正你的句子并将其重新解释:自由函数和方法之间没有太多区别.我们可以简化并说方法只是访问另一个名为`this`的输入参数,它是隐式传递的,并且可以在方法内部访问.关于局部变量和指针的生命范围,方法**绝对**没有与自由函数不同的行为. (2认同)

Tem*_*Rex 12

源文件中非成员函数的一个优点类似于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); }
Run Code Online (Sandbox Code Playgroud)

当然,这样写的时候,helper()只能使用公共接口Widget,所以你获得的收益很少.您可以friendhelper()内部声明,Widget但在某些时候,您最好切换到成熟的Pimpl解决方案.


Mar*_*k B 6

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

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

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