我应该使每个函数都是静态的,不接触成员变量吗?

时间:2011-05-26 07:57:26

标签: c++ static

设计效果对于使所有函数保持静态而不触及类的成员变量的影响是什么?

7 个答案:

答案 0 :(得分:8)

你应该考虑将它们作为非静态自由函数,正如this question中详细解释的那样。 This question也非常有趣。

简而言之,这些问题解释了您应该尽可能地选择非朋友非会员功能(意味着他们不访问非公开会员)。

答案 1 :(得分:3)

  

使所有函数静态不影响类的成员变量的设计和性能影响是什么?

性能:静态成员函数可能比非静态成员函数稍快,因为它们不需要传递this指针,但您不太可能注意到差异;在使用内联的地方,可能没有。此外,可以直接使用指向静态函数的指针,而非静态成员函数的“指针”通常是偏移/索引,并且需要this指针才能使用;所涉及的运行时CPU操作可能会稍微复杂一些。

设计:静态和非静态成员函数之间的选择可以根据访问对象的非静态成员数据的需要安全地进行,以便完全执行预期的操作。如果您对OOP感到满意并且使用符号object.fn(x, y, z)调用函数似乎并不直观且明智 - 该函数有助于将其视为对该特定对象的当前状态的操作 - 那么它可能不应该是非静态成员。

如我所理解的那样忽略这个问题并着眼于更广阔的地形,自由功能确实有其他回复中讨论的优点;反对静态成员的紧密联系可以帮助程序员找到可能有用的例程 - 所有这些都取决于他们拥有的工具和习惯。

答案 2 :(得分:0)

静态成员函数与自由函数的性能?
静态成员函数和自由函数之间绝对没有性能差异。

静态成员函数与非静态成员函数的性能?
通常static member function用于消除对象的需要并消除无关的this参数,这是non static member functions唯一的性能优势,但它几乎不可察觉。

答案 3 :(得分:0)

性能方面,静态成员函数更快,占用的堆栈空间更少,因为它们不需要传递this指针。但这不是一个重要的成本。

关于设计,如果函数不访问其数据成员,您应该问问自己为什么函数是该类的成员?肯定有包含静态功能的设计模式。然而,广泛使用的类设计方法是选择暴露类功能所需的最少数量的函数,同时保持其数据隐藏。这样可以更容易地更改类的内部,而无需对使用该类的代码进行连锁更改。这种方法几乎没有用于静态函数,因为它们无法提供对数据的访问。

答案 4 :(得分:0)

绝对是。非静态成员函数旨在满足非静态成员变量。如果不使用变量,则应该使函数static使您的设计更清晰,并且可以避免将this作为第一个隐藏参数传递(这会稍微提高性能)。

[注意:有趣的是,有一个值得注意的例外:

struct A {
  virtual void foo (int) = 0;
};

即使您没有在foo()内使用成员,也无法成为static! :)]

答案 5 :(得分:0)

有时将函数设置为虚拟即使它不访问任何实例成员 - 例如返回一些与类相关的属性(类似于动物类层次结构中的virtual bool eatsPlants())。然后它不能是静态的,因为C ++中没有虚拟静态成员。

答案 6 :(得分:0)

这取决于。首先,当然,如果函数是虚拟的,那么它 不能是静止的。 (我所拥有的大多数成员函数都没有触及 成员变量是虚拟的。否则,为什么要成为会员?) 否则,它取决于该类中函数的作用。如果它 从根本上说是独立于类的任何实例(例如它设置 然后,该类的某个全局参数(影响所有实例) 它应该是静态的;但是,这些功能应该是相当罕见的。如果 另一方面,它只是偶然的,它不会触及一个成员 变量;如果在概念上,它确实涉及特定实例,那么 使它成为会员。 (这在虚函数的情况下很常见, 但可能非常罕见。)