【C++】成员属性为什么不能直接初始化 静态成员属性为什么要类外部定义(初始化)

C++对象成员属性为什么不能声明时初始化,C++静态成员属性外部定义原因

struct和class的区别

首先struct肯定都知道,是用于声明结构体的,在C++中struct和class概念是相同的
虽然概念是相同的,但是还是有一些区别:
1 .默认继承权限:如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
2. 成员的默认访问权限:class的成员默认是private权限,struct默认是public权限。

C++对象成员属性为什么不能声明时初始化

既然struct和class概念是相同的,那么class也是用于声明,声明并非是定义,声明并不会为其开辟存储空间也就无法存储数据,所以在类中只能声明成员变量无法在声明时赋初值

  • 与struct相同,类的定义实际上相当于是类型的声明,并没有分配存储空间,初始化后的数据没有地方存放,类实例化以后才会有实体存储地址以及空间
  • 目前在C++11标准允许在类定义时初始化非静态数据成员了

C++静态成员属性外部定义原因

在一个类中,若将一个成员变量声明为static,这种成员称为静态成员变量。
在这里插入图片描述
c++规定const静态类成员可以直接初始化,其他非const的静态类成员需要在类外全局作用域下初始化,且不能使用static关键字。

  1. 首先const静态类成员由于被const修饰所以作为常量不占有内存,所以可以在类中初始化
  2. 静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间,在类构造中可以初始化(定义)静态成员(由于静态成员在对象没有创建前即可调用,所以再构造函数中初始化静态变量,当没有创建对象就使用静态成员时,会发生找不到定义错误,且每次定义都会改变静态变量)
  3. 静态成员变量在类中仅仅是声明,没有定义所以没有分配空间,也就无法存储初始化的数据,所以要在类的外面定义,实际上是给静态成员变量分配内存。(不定义会发生“未定义的引用”错误)
  4. 如果类外定义函数时在函数名前加了static,因为作用域的限制,就只能在当前文件里用,类本来就是为了给程序里各种地方用的,其他地方使用类是包含类的头文件,而无法包含类的源文件,这样就导致无法在其他地方调用这个静态的类成员函数。
  5. 静态成员变量存储在全局区中(为了方便在其他文件中调用类成员),所以在类外定义静态成员变量时,只能在全集作用域下定义,且不能加static关键字
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

列队猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值