静态成员函数

peo*_*oro 15 c++ static function static-members non-member-functions

在阅读sbi和Eli Bendersky在这个问题中的答案后,我开始想知道静态成员函数的用途.

一个类的朋友免费功能应该不能做任何静态成员函数可以做的事情?如果是这样,为什么/何时我应该更喜欢静态成员函数给朋友免费?

Cas*_*Cow 13

一般来说:

要求访问私人会员

静态成员函数可以访问该类的私有成员.如果需要,可以使用静态成员函数.你必须在标题中声明它才能让它访问,所以你也可以把它变成一个成员而不是一个朋友.对于具有getInstance()方法作为单例的单例,以及使用静态工厂方法createInstance()来确保它们在堆上创建的类,通常采用这种方式.这两个都需要访问私有构造函数.

元编程

静态成员函数非常适合模板元编程,在这种情况下,您可以传入一个类并调用其方法,而无需在调用时知道实际调用哪个函数.这通常称为"编译时多态",是元编程的重要组成部分.std :: char_traits基于这个原则.

禁止进入

私有静态成员函数的常见用法,只是为了使它只能由类访问,并且本身不需要访问私有成员,不能很好地利用静态成员函数,因为它是实现细节的一部分.这个类,最好在编译单元的匿名命名空间中完成.

但是,如果静态成员函数受到保护,则可以使用它,因为它可以由派生类调用,但不能由外部类调用.

朋友的功能

  • 可以访问私有成员,但无论如何都需要在标题中声明.
  • 可以在元编程中用作"重载"的一部分,但仍需要在标头中声明.(常见的例子是operator<<)
  • 对于友好的受保护访问不起作用,因为您在此处尝试执行的操作是限制对方法的访问,而不是访问该访问权限的访问权限.


Eli*_*sky 12

静态方法:

  • 在类创建的"命名空间"中提供封装.如果您的类是Animal静态方法Create,则必须使用它Animal::Create.这比全局函数更好,并允许使用相对自然的语法实现工厂和"虚拟构造函数".
  • 可以访问静态成员.这些成员在某些情况下很有用,如果没有静态方法和成员,则必须使用全局变量和函数.