为什么静态成员不能在类内初始化
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样。
class A
{
private:
static int count ; // 类内声明
};
int A::count = 0 ; // 类外初始化,不必再加static关键字
为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
什么东西能在类内初始化
能在类中初始化的成员只有一种,那就是静态常量成员。
这样不行
class A
{
private:
static int count = 0; // 静态成员不能在类内初始化
};
这样也不行
class A
{
private:
const int count = 0; // 常量成员也不能在类内初始化
};
三种类型必须通过初始化列表来初始化
1. 常量
2. 引用类型
3. 没有默认构造函数的类类型
但是这样可以
class A
{
private:
static const int count = 0; // 静态常量成员可以在类内初始化
};
VS2010支持C++11之前的标准(C++98/C++03),只有静态常量整型数据成员才可以在类中初始化。类定义只是一个框架,不是实例,不会分配存储空间,不会给它的成员变量赋值。只有类被实例化时,即创建对象,才会分配内存,才会给其成员变量赋值。静态常量整型数据成员是一个特例。
但这一点在C++11中有了变化,C++11允许就地初始化了。
一般当我们说到“分配空间”或者“分配内存”,都是指的对数据成员分配,而不是指成员函数。
从这个意义上来说,一个类只声明但是没有实例化,是不会给分配空间的。
既然楼主问到了“成员函数是否分配空间”,那就多罗索几句。
成员函数的代码是要占用空间的,但那是在代码段,我们通常说的分配空间都是数据段。
只要写了一个类,有成员函数,就需要在代码段保存代码,即使没有实例化也需要。
另一方面,不管有多少实例,代码也只保存一份,大家共用。
虽然类的函数的内存空间是独立于类对象的,但是类函数是否占有空间还是可能依赖于类对象。
没有被使用的类的函数,不会被链接到程序里;如果程序里没有类实例,很可能这个类相关的信息(包括函数)都不会被保留。