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++编码标准的一个要点,它指出自由功能和静态功能优于成员函数.
尽管这可能被认为是基于意见的,但它可以使课程变得少,并且可以分开关注.
这个答案指出:"这个规则的原因是,通过使用成员函数,你可能会意外地依赖于类的内部."
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,所以你获得的收益很少.您可以friend在helper()内部声明,Widget但在某些时候,您最好切换到成熟的Pimpl解决方案.
自由函数与成员函数的主要优点是它有助于将接口与实现分离.例如,std::sort不需要知道它运行的底层容器的任何信息,只需要访问一个提供某些特性的容器(通过迭代器)即可.
在您的示例中,该DoSomething2方法对减少耦合没有太大作用,因为它仍然必须通过引用传递来访问私有成员.在普通DoSomething方法中进行状态变异几乎肯定更明显.
当您可以根据类的公共接口实现任务或算法时,这使得它成为创建自由函数的良好候选者.Scott Meyers在此总结了一套合理的规则:http://cpptips.com/nmemfunc_encap