- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C++中const 、static、 static const和const static的初始化以及修改问题
本人系C++初学者,很渣很菜鸟,这也是本人写的第一篇有关C++的博文 ,说是写,不如说是对网络上高人博文的综合与整理。(当然,凡是本文涉及到别人博客内容的,都将附上网址链接。)写这篇博文的目的,是希望对相关知识做出尽可能全面、详尽、简易的解释,以供像我一样的初学者参考,同时也希望得到高人的批评与指正,以此来提高自己。另外,为保证文章的针对性,同时也限于本人水平,本文只对相关类型的数据做出讨论,并不涉及函数的讨论。下面,是我的一些整理与见解。
一、const、static、static const、const static变量的初始化
Ⅰ.const的初始化
(1)只有这一种情况const变量可以不在声明的同时定义,那就是const变量作为类的数据成员出现时。例如:
class Myclass
{
cons int a;//注意,在任何情况下,const int a与int const a等价,只不过???们习惯写前者
};
但要注意,这样做是毫无意义的,只是编译能够通过罢了,int const a什么也做不了,因为它没有值。
(2)凡是在函数(包括类中的,main函数及其它)中,const常量必须在声明时初始化,这是因为const被视为常量。例如:
class Myclass()
{
public:
int test()
{
const int b;
……
}
当输入int const b;一句时,在分号下面出现红色下划线,鼠标移到该处,出现报错:Error:常量 变量 “b”需要初始值设定项。(注意,在本文中,以后这种情况我们简称为“下划线报错”)
在main函数、全局函数中情况相似。
(3)作为全局常量
在全局中写
const int b;// 即不在类中,不在函数中
写代码时不会出现下划线,但编译时报错:如果不是外部的,则必须初始化常量对象。
注意这里的“外部的”是指声明为extern的常量。即将上句改为extern const int b;则可编译通过。因为声明为extern,就是在告诉编译器const int b是一个将在后面定义的变量。当然,如果只写extern const int b而不在其后对b赋值的话,也是毫无意义的(b没值,什么也干不了)。
关于xetern的详细情况,见注释①。
(3)如何初始化
1)作为类的数据成员
只能通过构造函数的初始化列表来初始化。注意在构造函数的函数体内初始化是不行的,见下例:
class Myclass
{
public:
Myclass()
{ //在大括号下面出现下划线报错:Error:Myclass ::Myclass()未提供初始值设定项。这是因为类中有const常量所以编译器提示在写构造函数时要提供初始化列表。
b=1; //b下下划线报错:Error:表达式必须是可修改的左值
}
private:
const int b;
};
对于这种情况,我们可以试着这样解释: b=1;写在函数体内,被看成是一条赋值语句,(这从报错“表达式必须是可修改的左值”可以看出)而b是常量,这当然是不允许的。
正确做法:
#include iostream
using namespace std;
Class Myclass
{
public:
Myclass(int bz):(b)bz{};
int Getdata()
{
return b;
}
private:
const int b;
};
void main()
{
Myclass obj(1);
coutobj. Getdata()endl;//输出1
}
2)其它地方的const常量
都可以直接初始化,即const int b=1;都可以。
最后,关于const ,再简单说两点。
⒈为什么不能在类内初始化const?
关于这一点,网上最普遍的说法是:
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。
但依本人愚见,更为主要的原因是:const数据成员是类内(in_class)成员(即类的不同对象中const数据成员的值可以不同)const int b;与int a;的不同仅在于,在一个对象中,a可以改b不可以改。无论对a还是b,初始化意味着为a和b分配内存,而我们知道,类是抽象的,并不占用内存,编译器编译时,根据类的数据成员计算出类的大小,但不进行内存分配操作(见注释②)。只有在实例化对象时,才为对
您可能关注的文档
最近下载
- 2025年行政执法考试-广西行政执法考试近5年真题荟萃附答案.docx
- 车辆通行费收费员《高速公路收费员考试答案》模拟练习卷(一).doc VIP
- 广东初中生物会考试卷2025 .pdf VIP
- 2024年5月辽宁省公务员考试公安联考结构化面试真题试题试卷答案解析9套全.doc VIP
- 第十五届成图-道桥类-国赛三维建模.pdf VIP
- 2025年河南机电职业学院单招职业适应性测试题库及一套答案.docx
- 入党志愿书(全电子版).pdf VIP
- NB_T 47013.3-2023 承压设备无损检测 第3部分:超声检测.pdf
- 重庆育才中学教育集团初2023-2024学年七年级下学期语文期中试卷(含答案).pdf VIP
- 110kV地区性变电站电气一次部分设计.doc
文档评论(0)