类内如何声明静态变量,常量问题

本文详细解析C++中类内的static变量与const常量的声明、初始化及存储特性,包括类内初始化限制、存储位置及作用域规则,适合初学者及进阶者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类内声明静态变量:

// static_variable.h
class a
{
	static int var;
};

// static_variable.cpp
#include "static_variable.h"
int a::var = 2;

说明
1、static变量必须在类方法文件(cpp)初始化,且初始化时不加static。因为声明文件为头文件,头文件内初始化可能会有多个文件包含,引发重定义。
2、类的静态变量属于整个类共有,所有类对象共用,存储静态区。
3、对于静态变量(除const静态成员外),类定义内部的那个叫引用性声明(即使可以类内写初始化代码)。其与类是一个级别的,因此类中静态变量必须在类外定义,与全局变量一样存储静态区

类内常量:
1、示例

//头文件.h
class a {
	const int monsts = 12; // C++11才有效:类内初始化
	//C++11前需要使用构造函数的初始化列表
	a():months(12) {}
};

C++11前不能使用原因 :类声明只描述结构,类对象定义前没有内存空间用于存储,只有定义了才有空间存放。

注:头文件内class外可以定义const常量,内部链接性(本文件可用),为定义常量专门设计的。详解

//头文件.h
const int a =2;

2、示例(static const 为类对象共有)

//.h
class a {
	static const int monst1 = 12;
	static const double monst2;
	enum{	month3 = 12;	}
};

//.cpp
const double a::monst2 = 12.2;

正确原因
1、static const成员的类内初始化仅新编译器支持,且只允许对整形常量初始化,对于非整形常量使用类外初始化
2、静态区存储,常量,所有对象共享。
3、由于表示常量,因此枚举不需要定义类型名。
但两者区别为:enum枚举只能定义整数,static const 可以定义浮点数。

参考资料:
C++ Primer Plus:第12.1.1节 428页 与 10.6.1节 371页
C++ —— 类中static和const关键字声明变量的初始化方式总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值