C++ Const(常类型)的作用总结
C++ Const的作用总结
面试或者工作中,我们经常遇到const修饰符定义的变量,函数和对象等。那么const的作用具体是什么,有哪些。今天自己好好的总结了一下,记录下来方便自己以后时间久了不记得,可以回头看一下。
在C中,我们都是习惯用#define来定义常量,C++中提供了const修饰符来定义常量,这种方式更灵活,更安全。主要表现在define常量是没有类型定义的,const常量是类型化的,它有地址,可以用指针指向这个值,但是不能修改它。
Const的使用
- 和指针一起使用
Const可以和指针一起使用,它们的组合情况比较复杂,可归纳为三种:指向常量的指针,常指针和指向常量的常指针。
(1) 指向常量的指针是指一个指向常量的指针变量,例如:
const char* info = “name”; // 声明指向常量的指针
这条语句的含义是:声明一个名为info的指针变量,它指向一个字符型的常量,初始化为info指向字符串“name”。
所以下面的一句是错误的:info [3] = ‘b’;
因为这里指针所指的数据(name)是常量,不能通过解引用来修改该数据。
然后下面这句话是允许的:info = “sex”;
因为指针本身是变量,可以指向其他的内存单元。
(2) 常指针是指把指针本身,而不是它指向的对象声明为常量,例如:
char * const info = “name”; // 常指针
这条语句的含义是:声明一个名为info的指针变量,它指向一个字符型数据的常指针,初始化为“name”的地址。常指针就是创建一个不能移动的固定指针(地址不能改变),但是它所指的数据是可以改变的。
所以下面的一句是错误的:info = “sex”;
因为指针本身是常量,不能指向其他的内存单元。
然后下面这句话是允许的:info [3] = ‘b’;
因为指针所指向的数据是可以通过解引用来修改的。
(3) 指向常量的常指针是指这个指针本身不能改变,它所指向的值也不能改变,声明一个指向常量的常指针,二者都要声明为const,例如:
const char * const info = “name”;
这里就是上面两种的结合了,info = “sex”和info [3] = ‘b’都是错误的。
其他说明:
a. 常量一旦建立,在程序的任何地方都不能在修改。
b. 与#define定义的常量不同,const定义的常量因为有自己的数据类型,这样C++编译时就会进行严格的类型检查,具有良好的编译时的检测性。
c. 函数的参数也可以用const说明,用于保证实参在该函数内部不被改动。
- 常引用
如果在声明引用是用const修饰,那么该引用就被称为常引用。常引用所引用的对象不能被更新。如果用常引用做为形参,便不会产生对实参不希望的修改。
定义:const 数据类型 &引用名;
如: int a = 5;
const int &b = a;
其中,b是一个常引用,它所引用的对象不允许更改,如果出现:
b=6;
则是非法的。(如果你写a=6,这个不会出问题,因为a不是常类型变量。)
常引用常常被用作形参,例如:
void main()
{
int a = 10;
int b = 20;
add(a, b);
} int add(cons int &a, const int &b)
{
// a += 10; // 非法的,形参a为常引用,不能改变它的值
return (a + b);
}
- 常对象
如果在声明对象的时候用const修饰,则称被声明的对象为常对象。常对象的数据成员值在对象的整个生命周期内不能被改变。
定义:类名 const 对象名[(参数表)]或者const 类名 对象名[(参数表)]
在定义对象时必须进行初始化,而且不能被更新,C++不允许直接或间接的更改常对象的数据成员。
- 常对象成员
(1) 常数据成员
类的数据成员可以是常量或常引用,使用const说明的数据成员称为常数据成员。如果在一个类中声明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化,而任何其他的函数都不能对该成员函数赋值。
(2) 常成员函数
在类中使用关键字const的函数称为常成员函数,常成员函数的格式如下:
返回类型 函数名(参数表)const;
const是函数类型的组成部分,所以在函数的实现部分也要带关键字const。
如:
void showDate() const; // 声明
void showDate() const // 实现
{
printf(“year”);
}
说明:
a. 如果将一个对象声明为常对象,则通过该对象只能调用它的常成员函数,而不能调用普通的成员函数。常成员函数是常对象的唯一的对外接口。
b. 常成员函数不能更新对象的数据成员,也不能调用该类中的普通成员函数,这就保证了在常成员函数中绝对不会更新数据成员的值。
C++ Const(常类型)的作用总结的更多相关文章
- C++:常类型Const
常类型:使用类型修饰符const说明的类型,常类型的变量或对象成员的值在程序运行期间是不可改变的. 3.10.1 常引用 如果在说明引用时用const修饰,则被说明的引用为常引用.如果用常引用做形参, ...
- const常量类型
1.定义:const常量类型表示一个”常值变量“,其值是不能被修改的变量.即一旦变量被声明为const类型,编译器将禁止任何试图修改该变量的操作. 2.声明:const <声明数据类型> ...
- 【C++编程基础】(1)—— 函数原型声明、函数模板、引用、const 常引用、const 常量指针
一.函数原型声明: 1.函数声明告诉编译器函数的名称,和如何调用函数(返回类型和参数):函数定义提供了函数的实际主体. 2.强制性的:在C++中,如果函数调用的位置在函数定义之前,则要求在函数调用之前 ...
- const 常引用
常类型是指使用类型修饰符 const 说明的类型,常类型的变量或对象的值是不能被更新的. 这篇主要说常引用.常引用是指所引用的对象不能被更新. 在实际应用中,常引用往往用来作为函数的形参,这样的参数称 ...
- const限定符的作用
const限定符的作用: 1.定义const常量:const可以将一个对象变成一个常量,不可被修改,所以定义的 时候必须进行初始 ...
- eclipse自动提示类型的作用
eclipse的自动提示功能确实十分好用,但是只是笼统的都勾上了,所有会有好多重复项,看着很眼疼. 今天就稍微研究了下,略微知道了几个类型的作用: 序号 类型 大体的中文意思 作用 1 Java Ty ...
- c指针类型的作用
指针类型的作用 任何类型的指针占用的空间大小都是相同的(32位CPU是4字节:64位CPU是8字节) 既然任何类型的指针占用的空间大小都是相同的,为什么指针还需要类型呢?指针只是指向了一个内存地址,但 ...
- 如何修改const常量值
总结:这个跟计算机语言类别和编译器有关,本文是在linux环境下说明的. 分两种情况: 1. C语言: 2. C++语言: /*! * \Description: * \author scictor ...
- 【VS2013编译DirectX Tutorials时遇到的错误】"const wchar_t *" 类型的实参与 "LPCSTR" 类型的形参不兼容
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/3696367.html 通过查看LPCSTR的定义: typedef _Null_te ...
随机推荐
- python string.py 源码分析 三:maketrans
l = map(chr, xrange(256)) #将ascii转为字符串 _idmap = str('').join(l) del l # Construct a translation stri ...
- 3种归并操作js代码
/**良哥的*/ function merge(a, b) { var aLen = a.length, bLen = b.length, maxLen = Math.max(aLen, bLen), ...
- JAVA笔记 之 Thread线程
线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在. 线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部 ...
- ubuntu 添加管理员账户
sudo adduser cat 输入密码即可 sudo adduser cat sudo 为cat 添加sudo 权限
- 将main方法打成jar包,并引用第三方的maven jar包
一.准备工作.执行命令 学习插件: 学习apache的打包插件maven-assembly-plugin:http://maven.apache.org/plugins/maven-assembly- ...
- 利用__index和__newindex实现默认值表、监控表、只读表
__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ...
- ionic 添加地图定位功能
由于项目需求,需要一个定位功能,通过google或百度,搜到一个cordova-plugin-geolocation的插件,在ios上可以用,但是在android就呵呵了,原因就不说了,大家都知道.所 ...
- Java后端书架
本书架主要针对Java后端开发与架构. 更新记录:4.0版把第五部份-具体技术的书整块拿掉了.<TCP/IP详解 卷1:协议>出到了第二版,增加<SRE:Google运维解密> ...
- gulp-clean----gulp系列(五)
前面说过,当css,img,js出现删除操作的时候,虽然watch会监听,但是并不会删除相应文件. 现在实现clean任务,执行任务前先删除一次build目录. 先配置JS任务,设置删除目录. 在系列 ...
- Lambda表达式和匿名内部类(I)
本文git地址 前言 Java Labmda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖,JVM内部是通过 ...