这里有一个样式问题。假设我有一个类A
,它必须对其成员变量B b
执行一系列相当复杂的事情
class A {
public:
void DoStuffOnB(){
DoThing1();
DoThing2();
DoThing3();
}
private:
B b;
void DoThing1(){ /* modify b */ }
void DoThing2(){ /* modify b */ }
void DoThing3(){ /* modify b */ }
};
其中DoThings
函数仅依赖于b
(或其他成员变量和一些传递的参数)。如果我想让这些功能在将来可以重复使用,我最好把它们写成:
class A {
public:
void DoStuffOnB(){
DoThing1(b);
DoThing2(b);
DoThing3(b);
}
private:
B b;
void DoThing1(B& b){ /* modify b */ }
void DoThing2(B& b){ /* modify b */ }
void DoThing3(B& b){ /* modify b */ }
};
然后我的DoThing
函数可以在以后的其他地方复制。我最好编写函数来获取所有相关参数,或者该函数是否只采用非成员参数?
如果答案是"你应该编写函数来获取所有相关参数",为什么还要把它放在一个类中呢?
什么时候应该使用免费功能,什么时候应该使用会员功能?
答案 0 :(得分:3)
从上下文假设"在B"做某事函数仅对B
成员进行操作,而不是A
中的其他状态:
B
的私有状态,那么它们应该是B
的成员。答案 1 :(得分:1)
成员函数是一个成员函数,因为它的“范围”可以访问成员变量,而不必使用引用和指针语法。正如前面提到的那样,这很可能会使代码和维护变得更简单,所以你会使用这个方法,除非你需要这个函数是一个自由函数,它可能采用相同类型的数据但是来自不同的类,在这种情况下你必须通过通过引用或使用指针来获取对变量范围的访问权。
答案 2 :(得分:0)
您是否应该在成员函数中传递成员变量?
没有需要将成员变量传递给成员函数,因为成员函数可以访问所有数据成员。
它类似于访问静态文件局部变量的自由站立函数。这些函数可以访问同一翻译单元中的静态声明变量。
什么时候应该使用独立功能?什么时候应该使用会员功能?
通常,在功能与对象关联时使用成员函数。
时使用独立功能
该课程有静态成员
或功能与类关联,不使用静态 成员。
当相同的功能适用于不同的对象时,您也可以使用独立功能 例如,让我们谈谈对象的序列化或输出。
可以在对象中定义方法load_from_buffer()
,但它不适用于POD类型。
但是,如果某个函数load_from_buffer()
是独立的,则可以针对不同的类型重载它,例如int
,char
,double
以及模板,重载可以调用从接口派生的对象。
<强>摘要强>
当需要访问对象的数据成员时,更喜欢使用成员方法。在访问静态数据成员时使用静态成员方法,或者需要没有对象实例的功能(想想封装)。独立功能还基于功能重载为不同对象提供功能。
没有硬规则,只需使用您认为最容易维护的内容,协助正确性和稳健性并加快开发。
只是为了让人迷惑,这是Scott Meyers的一篇文章:
How Non-Member functions increase encapsulation
请记住,为了使自由站立功能能够访问对象的数据成员,必须为数据成员提供公共访问权限,或者该功能需要成为该对象的朋友。典型的例子是重载类的流操作符。