问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

const限定符

发布网友 发布时间:2022-04-29 12:12

我来回答

4个回答

热心网友 时间:2022-06-27 12:09

1. const常量,如const int max = 100;
优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
2. const 修饰类的数据成员。
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。 const数据成员的初始化只能在类的构造函数的初始化表中进行。
3. const修饰指针的情况,见下式:
const int* a = & [1]
int const *a = & [2]
int* const a = & [3]
const int* const a = & [4]
可以参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常量。
4. const的初始化
先看一下const变量初始化的情况
1) 非指针const常量初始化的情况:A b;
const A a = b;
2) 指针const常量初始化的情况:
A* d = new A();
const A* c = d;
或者:const A* c = new A();
3)引用const常量初始化的情况:
A f;
const A& e = f; // 这样作e只能访问声明为const的函数,而不能访问一般的成员函数;
5. const在函数声明中的应用
在函数声明中,const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。
1) 修饰参数的const-HEIGHT: 150%; FONT-FAMILY: 宋体">,如 void fun0(const A* a ); void fun1(const A& a);
调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。
[注意]:参数const通常用于参数为指针或引用的情况,且只能修饰输入参数;若输入参数采用“值传递”方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。
[总结]对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是为了提高效率。例如,将void Func(A a)改为void Func(const A &a)
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x)不应该改为void Func(const int &x)
2) 修饰返回值的const,如const A fun2( ); const A* fun3( );
这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
[总结] 1) 一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。2)如果给采用“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
6. 类成员函数中const的使用
一般放在函数体后,形如:void fun() const; 任何不会修改数据成员的函数都因该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将报错,这大大提高了程序的健壮性。
7. 使用const的一些建议
1 )要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
2 )要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
3 )在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
4 )const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
5 )不要轻易的将函数的返回值类型定为const;
6 )除了重载操作符外一般不要将返回值类型定为对某个对象的const引用。

热心网友 时间:2022-06-27 12:10

1.1 定义const对象
const int bufSize =512;
定义bufSize为常量并初始化512.变量bufSize仍然是一个左值,但是这个左值是不可修改的。任何改变bufSize的尝试都会导致编译错误
bufSize=0 //error:attempt to write const object
因为常量在定义后是不可修改的,所以定义是必须初始化。
1.2 const对象默认为文件的局部变量
在全局作用域里定义非const变量时,它在整个程序中都可以访问。我们可以把一个非const变量定义在一个文件中,假设已经做了合适的声明,就可以另一个文件中使用这个变量:

热心网友 时间:2022-06-27 12:10

常量,不变。

热心网友 时间:2022-06-27 12:11

这个地方基本上解释得比较多了。
http://ke.baidu.com/view/1065598.htm

参考资料:百度百科

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 限定符是什么意思? C++中为什么说const限定符比#define好呢,#define是查找修改,而const已经将值定义死了不可修改。 正则表达式中的\是什么意思呢? C++中类型说明符、类型限定符、类型修饰符的区别是什么?希望分别介绍一下 vb中无效限定符是什么意思 javascript的限定符 C++中const限定符的几种常见用法 vb无效限定符 文献检索中限定符 in 、/的意义 红枣面包怎么做法视频 基础面包配方怎么做 卡通小面包的做法视频 包面的家常做法大全怎么做好吃视频 PYTHON如何打印列表中每个元素 qq黄钻怎么给好友升级超级黄钻 我今天开的黄钻可不可以升级为豪华黄钻??如果可以那么应该怎么办? 黄钻怎样升级 java语言具体可以分为哪些门类??? QQ黄钻的升级是怎么升级的? 怎样才能让黄钻升级? 作用域限定符::的用法问题 excel2010数据有效性限定符 const限定符的疑惑,该怎么解决 scanf在输入unsigned char时所使用的格式限定符是什么? c++为什么引入限定符,相比其他编程语言引入限定符的好处是? 正则表达式/^[^\?]+\??/是什么意思 vb中无效限定符什么意思 我爸爸梦见窗户快掉下来什么预兆? 梦到自己不小心从窗户掉下去 python 怎么列表逆序打印? Excel Excel 打印时怎么只能打一半,剩一半在另一张纸上 - 信息提示 用excel做的表格,为什么只打印出一半 锯齿刀如何打磨? 那种锯齿状的刀刃能磨吗?怎么磨? 伤害世界怎么开服务器 伤害世界正版怎么建私人服务器 切管机的锯齿刀怎么磨才好用 伤害世界怎么开服 伤害世界Hurtworld服务器怎么选 新手怎么找好服务器攻略