C++类成员函数中的'static'是什么意思?

4

为什么需要使用static关键字?

编译器为什么不能推断出是否需要使用'static'?

如下:

如果我在没有访问非静态成员数据的情况下编译此函数,是可以的 -> 静态函数。否则 -> 非静态函数。

为什么编译器不会自动推断呢?

5个回答

7
如果你期望编译器能够即时决定它是否是静态的,那么这会对链接到刚刚定义方法签名的头文件的外部源文件产生什么影响?

4
静态或非静态属性会影响函数类型。非静态成员函数有一个隐含的“this”参数,而静态函数没有,这是其中之一的例子。
换句话说,静态和非静态成员函数之间存在重大的定性差异。编译器无法“推断”这一点。这是作者意图的问题。
如果我希望(并且需要)我的函数是非静态的,即使它不访问类的任何非静态成员,我也会将其设置为非静态。如果编译器因为函数不访问类的任何非静态成员而突然决定将我的非静态函数变为静态的,在一般情况下它会破坏代码的功能。

1

是的,编译器可以做到,但它并不知道你的意图。而原始设计者可能认为提供你的意图是很重要的。


0

在语言中具有这样的冗余性有助于确保编译器能够捕捉到许多程序员错误。


0
另一个原因是:如果函数是静态的,它就不能在派生类中被覆盖。没有多态性。

那是虚拟的,不是静态的。派生类可以隐藏静态和非静态基成员,例如std:: fstream :: rdbuf。 - Roger Pate
@Roger:他在问为什么不访问任何成员变量的方法不会被编译器自动声明为“静态”。我认为虚拟方法可能会或可能不会访问成员变量,但你不希望编译器自动将它们声明为静态。 - Scott Smith
1
一个虚方法,仅凭其是虚的这一事实,就意味着可以访问成员变量。也就是说,虚表。而且,由于我们只讨论隐式静态,而不是隐式虚拟,因此标记为虚拟的任何方法都永远不会有资格自动分类为静态。 - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接