繁体   English   中英

你应该在成员函数中传递成员变量吗?

[英]Should you pass member variables within member functions?

这里有一个风格问题。 假设我有一个AA它必须对其成员变量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()是独立的,它可以为不同的类型重载,例如intchardouble和模板,可以重载调用从接口派生的对象。

摘要
当需要访问对象的数据成员时,更喜欢使用成员方法。 在访问静态数据成员时使用静态成员方法,或者需要没有对象实例的功能(想想封装)。 独立功能还基于功能重载为不同对象提供功能。

没有硬规则,只需使用您认为最容易维护的内容,协助正确性和稳健性并加快开发。

只是为了让人迷惑,这是Scott Meyers的一篇文章:
非成员函数如何增加封装

请记住,为了使自由站立功能访问对象的数据成员,必须为数据成员提供公共访问权限,或者该功能需要是该对象的朋友。 典型的例子是重载类的流操作符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM