C++ static 静态成员为什么需要在类外定义的一点思考

引言

在阅读《C++ Primer》当中关于类静态成员变量时,作者在书中声明了两条原则:

  • const 静态成员可以在类中进行初始化
  • nonconst 静态成员必须在全局(即函数外)进行初始化
class X {
	// 不合法
	static int i = 5;
	// 合法
	const static int j = 5;
}

这样的规则给我带来了一些困惑。因为我们知道成员变量是可以定义类内初始化器的:

class X {
	int i = 5;
}

那为什么对于静态成员变量,我们无法定义类似的类初始化器呢?笔者在stackoverflow上找到了相关的解答。

头文件与类

首先,我们需要知道编译器如何处理类的定义:类的定义是类型的定义,而非变量的声明和定义。对于普通的类内成员,直到对象的创建,其成员才会被分配内存并初始化,也就是我们说的定义

基于上述的知识,我们可以解释C++编程中最基础的过程之一:类被定义在头文件当中,而头文件被多个源文件所引用(本质是预处理中的复制),预处理后的代码当中会有许多对同一类的定义,而因为类的定义是类型的定义,因此,这一过程是合法的。

静态变量

针对静态变量而言,静态变量与类相关,而非与对象相关,因此,如果我们允许静态成员在类内进行初始化,那么我们会把下面的代码当作变量的定义

class X {
	static int i = 5;
}

那么当预处理完成后,所有引用该头文件的源文件都会对该变量进行定义,C++无法处理重定义问题(单定义原则)。因此,我们需要在类外对该变量进行定义与初始化。

const静态变量(静态常量)

对于静态常量,笔者有不同的疑惑,为什么 const static 成员可以在类内进行声明?在查阅了诸多问题后,笔者认为这是编译器的优化

在stackoverflow早期的相关问题当中(2010年左右),在类内对静态常量进行定义和初始化也是非法的(原因同上),但是在近来,至少笔者使用的clang++已经支持在类内对静态常量进行初始化。

推测其原因:静态常量无法被更改,并且只能被初始化一次。基于这一原则,编译器其实可以处理这一特殊的重定义行为。

但是尽管如此,《C++ Primer》书中仍建议在类外对静态常量进行定义,而非类内,笔者也认同这一原则。编程风格的要点并不是记住编译器的所有操作,而是自己代码风格与编译器原则的统一。

最后

笔者在大学期间并没有系统的学习编译原理(后期打算补上),其中部分内容是笔者结合网络内容以及自身实验进行的臆测,若有不对敬请指正,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值