拥有一个自由函数(在匿名命名空间中只能在单个源文件中访问)并将所有变量作为参数发送,而不是让私有类成员函数没有任何参数并直接访问成员变量,这有什么好处?谢谢!
头:
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
}
如果您更喜欢将它们作为成员,那么如果我有一个案例,我首先调用一个不访问任何成员变量的函数,但该函数调用另一个访问成员的函数。它们既可以是会员功能还是免费的?
答案 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