当前位置: 首页 > news >正文

C++ 静态成员变量初始化规则

每一天一个小trick!!

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

在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样。

class A 
{ 
private: 
static int count ; // 类内声明 
};// 类外定义并初始化,不必再加static关键字
int A::count = 0 ; 

或者只进行定义不赋初始值,但是默认值是否是0,可能会与具体的编译器有关吧?

// 只进行定义不赋初始值,但默认值视编译器而定
int A::count;

为什么?

因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。

如果不增加int A::count = 0 ; //变量定义,在编译的时候将会报出:‘A::count’未定义的引用”错误。这是因为静态成员变量count未定义,也就是还没有分配内存,显然是不可以访问的。

《c++primer》里面说在类外定义和初始化是保证static成员变量只被定义一次的好方法。 但为什么static const int就可以在类里面初始化呢?
想起C中一个函数里定义一个static变量是为了保证只初始化一次。

那么,是否可以这样理解: static数据成员在类外定义和初始化是为了保证只被定义和初始化一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。 static const int可以在类里面初始化,是因为它既然是const的,那程序就不会再去试图初始化了。

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

能在类中初始化的静态成员只有一种,那就是静态常量成员。

//这样不行 
class A { 
private: static int count = 0; // 静态成员不能在类内初始化 
};//这样也不行 
class A { 
private: const int count = 0; // 常量成员也不能在类内初始化 
};//但是这样可以 
class A { 
private: static const int count = 0; // 静态整型常量成员可以在类内初始化,但是 static const float count就不行了 
};

总结:

静态成员变量,类内定义,类外初始化。

今天突然记起来大学学习c++时候这句顺口溜。有复习一个知识点。 

http://www.lryc.cn/news/222633.html

相关文章:

  • Docker安装、卸载,以及各种操作
  • 深入理解 C 语言的内存管理
  • 利用Caddy实现http反向代理
  • 【Qt之QVariant】使用
  • xv6实验课程--xv6的写时复制fork(2023)
  • 在Windows或Mac上安装并运行LLAMA2
  • Spring底层原理学习笔记--第七讲--(初始化与销毁)
  • 基于斑马算法的无人机航迹规划-附代码
  • 干货 | 接口自动化测试分层设计与实践总结
  • 【Linux】服务器与磁盘补充知识,硬raid操作指南
  • 【java】实现自定义注解校验——方法二
  • 算法通关村第六关|白银|二叉树的层次遍历【持续更新】
  • vue中通过js控制scss变量
  • 深度学习理论知识入门【EM算法、VAE算法、GAN算法】和【RBM算法、MCMC算法、HMC算法】
  • Java8实战-总结47
  • 功能: 在web应用程序中、读取文件
  • TDD、BDD、ATDD以及SBE的概念和区别
  • Android studio:打开应用程序闪退的问题
  • Mysql数据库性能优化--performance_SCHEMA.STATEMENTS语句分析
  • [C/C++]数据结构 链表OJ题: 反转链表
  • 深度学习之基于YoloV5交通信号标志识别系统
  • Linux命令大全
  • 元宇宙是否为噱头?若不是,什么是元宇宙?他的概念、技术、应用和影响是什么?
  • 293_C++_告警类
  • MySQL基础操作
  • ajax样式演示
  • Web前端—CSS高级(定位、高级技巧、CSS修饰属性、综合案例:购物网站轮播图)
  • linux的sftp复制传输文件
  • 【星海出品】flask(一)demo
  • 从vue源码中看diff算法