静态成员函数并不会关联到this指针,因此差不多等同于外部函数。主要有下面三个特性
1. 不能直接存取其class内的非静态成员
2. 不能够直接声明为const
3. 不需要通过对象来调用。
Static成员函数能声明为const吗?
不能。static成员函数是类所有的,可以直接用类名访问,不属于任何一个对象,访问时不会带上this指针。
但是const成员函数,访问时会添加一个隐式的const this*, 二者的用法是冲突矛盾的。
static成员函数能声明为virtual吗?
不能。静态成员函数对于每个类来说只有一份代码,没有多态绑定的必要性。
为什么C++不支持构造函数为虚函数?
虚函数通过虚指针vptr来访问,vptr通过构造函数来初始化。如果构造函数是虚函数,也就是产生无法产生vptr,将陷入悖论。
下面我们来看上面几个问题
1.类的析构函数可以为virtual吗?
毋庸置疑,对于可能作为基类的类的析构函数要求就是virtual的。因为如果不是virtual的,派生类析构的时候调用的是基类的析构函数,而基类的析构函数只要对基类部分进行析构,从而可能导致派生类部分出现内存泄漏问题。
2.类的构造函数可以为virtual吗?
答案也是不能的,通过上面虚函数的调用方式我们知道虚函数是通过vptr来访问的。那么vptr是怎么来的呢?vptr确定通过构造函数来初始化的。鸡生蛋,蛋生鸡,鸡生蛋……
3.类的构造函数可以为static吗?
根据之前说的static不能访问非静态成员变量这点可以知道构造函数是不可以为static的。两者static是对应于每个类的,而构造函数主要负责初始化对象的。这里要提一下C#中的static构造函数是用于在使用类之前进行相关的初始化工作。比如,初始化静态成员或执行特定操作。CLR在第一次创建该类对象或调用该类静态方法时自动调用静态构造函数。
4.类的析构函数可以为static吗?
同上。
5.virtual函数可以为static吗?
答案是不可以。virtual函数和static函数访问方式是不一样。