应该在成员函数中传递成员变量吗?
Should you pass member variables within member functions?
这是一个风格问题。假设我有一个类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
函数可以在未来的其他地方复制。我是应该把函数写成这样接受所有相关参数,还是应该只接受非成员参数?
如果答案是"你应该编写函数来接受所有相关参数",为什么要把它放在一个类中呢?
什么时候使用自由函数,什么时候使用成员函数?
从上下文中假设"在B上做点什么"函数仅操作B
成员而不操作A
中的其他状态,则:
- 如果函数直接操作
B
的私有状态,那么它们应该是B
的成员。
成员函数之所以是成员函数,是因为它的作用域不必使用引用和指针语法就可以访问成员变量。正如前面有人提到的那样,这很可能使代码和维护更简单,所以除非您需要函数是一个可能从不同类获取相同类型数据的自由函数,否则您将使用此方法,在这种情况下,您必须通过引用传递或使用指针来访问变量的作用域。
应该在成员函数中传递成员变量吗?
不需要将成员变量传递给成员函数,因为成员函数可以访问所有的数据成员。
它类似于访问静态文件局部变量的独立函数。函数可以访问同一转换单元中静态声明的变量。
何时应该使用独立函数,何时应该使用成员函数?
一般来说,当函数与对象相关联时,使用成员函数。
使用独立函数
-
类有静态成员
-
或功能与类相关联,不使用静态成员。
当相同的功能可以应用于不同的对象时,你也可以使用独立函数。
例如,让我们谈谈对象的序列化或输出。
可以在对象中定义方法load_from_buffer()
,但它不能用于POD类型。
然而,如果一个函数load_from_buffer()
是独立的,它可以重载不同的类型,如int
, char
, double
和模板,重载可以调用从接口派生的对象。
当成员方法需要访问对象的数据成员时,首选使用成员方法。当静态成员方法访问静态数据成员或需要在没有对象实例的情况下使用该功能时(考虑封装),请使用静态成员方法。独立函数还提供了基于函数重载的不同对象的功能。
没有硬性的规则,只要使用你认为最容易维护的,有助于正确性和健壮性,加快开发。
只是为了迷惑人们,这里是Scott Meyers的一篇文章:
非成员函数如何提高封装性
请记住,为了使独立函数访问对象的数据成员,必须为数据成员提供公共访问权限,或者该函数需要是对象的友元。典型的例子是重载类的流操作符。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查