c++11之前,只有静态常量整型数据成员才可以在类中初始化是为什么

为什么静态成员不能在类内初始化

在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允许就地初始化了。

一般当我们说到“分配空间”或者“分配内存”,都是指的对数据成员分配,而不是指成员函数。
从这个意义上来说,一个类只声明但是没有实例化,是不会给分配空间的。

既然楼主问到了“成员函数是否分配空间”,那就多罗索几句。
成员函数的代码是要占用空间的,但那是在代码段,我们通常说的分配空间都是数据段。
只要写了一个类,有成员函数,就需要在代码段保存代码,即使没有实例化也需要。
另一方面,不管有多少实例,代码也只保存一份,大家共用。

虽然类的函数的内存空间是独立于类对象的,但是类函数是否占有空间还是可能依赖于类对象。
没有被使用的类的函数,不会被链接到程序里;如果程序里没有类实例,很可能这个类相关的信息(包括函数)都不会被保留。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值