C++中const、static、 static const和const static的初始化以及修改问题

2026/1/27 14:47:07

此时不能再带上static的关键字。(见例2、例3、例4)

? 因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不

属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它; (见例5)

? 若不对静态数据成员初始化,系统自动将int型初始化为0,char型自动初始化为

ASSIC码值为0的字符(NULL),但一定注意,此时初始化语句还是要写,只不过不赋右值,例如int Myclass::a;(见例5)

? 静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:

<数据类型><类名>::<静态数据成员名>=<值> ? 类的静态数据成员有两种访问形式:

<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名> 如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员 ;

? 静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,

每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;

? 同全局变量相比,使用静态数据成员有两个优势:

1. 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲

突的可能性;

2. 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能; 以上总结来自http://blog.csdn.net/jsjwql/article/details/1788286 。 例1:

#include using namespace std; class Myclass {

public:

Myclass(int a=0,char b=0,float c=0 ){} private: int a; char b; float c; static int d; };

int Myclass::d=1; void main() {

Myclass obj(1,'a',1.0);

cout<

由此可以看出,对象obj指向的内存的大小就是int a、char b、float c的大小,不包括static int d,由此可知static不属于具体对象。其实,前三者存在栈区,后一者存在静态数据

区。至于char b占一个字节,为什么输出是12,这是编译系统进行内存对齐的缘故。至于对齐,还是那句话,不是重点不展开,相信读者自己能够解决。 例2:(这里我们只给出代码段,说明问题即可) class Myclass {

public:

Myclass(int az):a(az){}//a下下划线报错:Error:“a”不是类“Myclass”的非静态数据成 private: //或基类

static int a;//也可以写成int static a; };

这说明不能通过构造函数初始化列表初始化static数据成员。 例3:

#include using namespace std; class Myclass {

public:

Myclass(int az) //企图通过构造函数,在函数体内对static int a 初始化 { a=az; } int re_a() { return a; } private: static int a; };

void main () { Myclass obj(1); cout<

写代码时不会出现下划线报错,但编译过不去,有类似“一个无法解释的外部命令”的报错。 例4:

#include using namespace std; class Myclass {

public: int re_a() { return a;

} void chong_fu_zhi() { a=2; } private: static int a; };

int Myclass::a=1;

//static int Myclass::a=1;//如果这样写,会出现下划线报错:Error:此处不能指定存储类

void main () { Myclass obj1,obj2;

}

cout<

obj1.chong_fu_zhi();//注意这里只是修改obj1的a,但a值一改全改,这恰说明a cout<

例5:

#include using namespace std; class Myclass {

public: static int a; static int b; static char c; };

int Myclass::a=1; int Myclass::b; int Myclass::c; void main() {

cout<< Myclass::a<

cout<< Myclass::a<

2)如何初始化

前面说的够多了,见例4就可以了。

Ⅲ.static const和const static的初始化 1)简单说明

首先需要说明,以本人的认识和经验,static const和const static在使用上没有什

么区别,可以看作同一类型的两种写法。一个是静态常量,一个是常量静态,都兼具了static和const的特点,把握好了这一点,下面的内容就不难理解了。 关于这两者,我们就不过多的介绍了,其实也没什么可介绍的了,大家知道它们既有static的特点又有const的特点就行了,下面我们来说明它们的初始化。 2)如何初始化 ⅰ.先说普遍情况

⒈类外(包括全局、普通函数、main函数中) 直接初始化,即

static const int a=1; //当然也可以写成int static const,static static const float b= 1.1; //const也可以互换位置。 等都可以。

⒉类内的函数中(普通成员函数,构造函数中)

同⒈,可以直接初始化。注意,说在构造函数中可以,是说类似static const floatb= 1.1;这样的语句可编译通过,并不是说在类内可以对static const数据成员初始化 ,当然,我还没发现在构造函数中写类似static const float b= 1.1这样的语句有什么实际用途,只是知道这样写是可以通过编译的。举一小例: #include using namespace std; class Myclass {

public:

float ceshi() {

static const float c=1.6f;// (*)注意这里的f,后面解释 return c; } };

void main() {

Myclass obj;

cout<

简单说一下(*)句的f,因为编译器将1.6默认为double,若不加f(或F),会出现警告:从“double”到“const float”截断,当然不影响运行,我想大家知道就可以了。 ⒊作为类的数据成员

前面说过,static const兼有static、const的双重特点,故不能初始化static、const数据成员的形式,自然不能拿来初始化static const。即不能直接初始化(当然不包括后面讲到的特例),也不能在构造函数中初始化(无论是在初始化列表还是在函数体中)。由于情况与前边十分类似,这里不再给出代码来举例说明。

既然如此,那就只好在类外初始化,形式同static。 eg.

#include using namespace std; class Myclass


C++中const、static、 static const和const stati.doc 将本文的Word文档下载到电脑
搜索更多关于: C++中const、static、 static const 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219