C++中const、static、 static const和const static的初始化以及(2)

2019-08-30 11:35

区。至于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

{

public:

float Get_a() {

return a; }

float Get_b() {

return b; } private:

static const float a; const static float b; };

const float Myclass::a=1.6f;// f的事情已经解释过 //见注释④ const float Myclass::b=2.1f; void main() {

Myclass obj;

cout<

ⅱ.再说明特殊情况

static const int型 和static const char型数据成员可以在类内初始化! eg.

#include using namespace std; class Myclass {

public:

float Get_a() {

return a; }

char Get_t() {

return t; } private:

static const int a=1; static const char t='a'; };

void main() {

Myclass obj;

cout<

如果在private下写static const float a=1.1;是不行的,等号下下划线报错:Error:“const float”类型的成员不能包含“in-class initializer”,即不能在类内初始化。编译报错:只有静态常量整型数据成员才可以在类中初始化!

至于原因,在下在网上找到的最有说服力的答案是:

=============================================================================== C++11 之前的标准

只有静态常量整型数据成员,才可以在类中初始化。

这是因为,当时认为,类定义中的数据定义,是一种声明,不是数据定义。 当用类定义对象(变量,常量)时候,才开始定义数据。

静态常量整型数据成员 1)不是对象的一部分

2)可以产生常量表达式,所以可以在类中初始化。---否则,用它作为数组的大小,就不合适了。

静态常量整型数据成员,能够用来当作常量表达式使用, 不在内部定义的话,则该常量表达式未定义,就不能使用了。 C++11 非静态成员变量(常量),可以直接初始化,或者在初始化表中初始化。 C++11 中 初始化非静态成员变量(常量),可以看作赋给变量(常量)一个默认值。=============================================================================== 除此之外,本人补充一下:

static const int a=1;并不分配内存,编译时直接将a换成1,放到常量表中(关于常量表,本人不是很清楚,读者可以百度,有知道的欢迎告诉我),当然,若对a取地址,则在只读的常量区分配内存。所以,这和类声明不分配内存并不矛盾。至于为什么char型数据成员也可以,我想着应该与char的实现机制有关,char型可以转换成int型,毕竟我们知道字符可以以int型输出其ASSIC码值。不知道我的想法是否正确,欢迎高人批评指正。

而至于为什么别的类型(比如float)不可以在类内初始化,是因为他们不能像int那样直接进行常量替换,而为什么不能直接进行常量替换,我能给出的解释只能是C++的机制问题,此时不妨参考上面高人给出的解释,从为什么int能来从反面理解为什么其它类型不能。另外,从C++11允许对所有非静态成员变量(常量)在类内初始化更可以看出这是C++本身机制的问题。还是那句话,希望高人指点迷津。对于高人说的“常量表达式”和“数组”,我想可从下面的例子了解一二。例如,在类的private下写: static const int n=10; int str[n];//声明数组

不会下划线报错,鼠标移到str下,显示int myclass::str[10]; 但如果在Myclass类内的private下写 static const int n; int str[n];

在类外初始化const int Myclass::n=10;

则int str[n];一句中n下下划线报错:Error:表达式必须含有常量值

由此可对高人的话有所理解。但同时,我想说,我觉得通过n来声明数组完全没必要,


C++中const、static、 static const和const static的初始化以及(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:河北省唐山一中11-12学年高二下学期期末考试数学文试题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

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