一、const引用

1. 例子一

#include <iostream>
using namespace std; class sp { public:
sp() {cout<<"sp()"<<endl;}
sp(sp *other) {
cout<<"sp(sp *other)"<<endl;
}
/*
* 此例子中这个拷贝构造函数要么不存在,
* 只要存在参数必须加const修饰。
*/
sp(const sp &other) {
cout<<"sp(sp &other)"<<endl;
}
~sp() {
cout<<"~sp()"<<endl;
}
}; int main(int argc, char **argv)
{
sp other = new sp();
return ;
}

执行结果:

sp()
sp(sp *other)
~sp()

1.拷贝构造函数没有使用但是其参数必须是const引用的原因:

sp other = new sp();
① new sp()生成一个sp*的临时指针变量。
② 然后使用这个临时的sp*为参数调用构造函数sp(sp *other)构造出一个临时的sp对象。
③ 使用这个临时的sp对象来调用拷贝构造函数来初始化sp other。
由于此例中拷贝构造函数的参数传递的是一个sp的临时变量,所有需要是const引用。

从执行结果上拷贝构造函数的确没有调用,那是高版本的编译器做了优化,但是在编译期编译器仍然做了检查,所以会报这个错!

2.const引用就不可再拷贝构造函数中修改参数other的成员了(read only), 也不存在这个需求。

3.另一个例子

int a = ;
int &b = a++;

编译报错: error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’ ,修复:

int a = ;
const int &b = a++;

二、在函数名前后加const

(1)在函数名后加const:
只有类的成员函数才能在函数名后面加上const,此时这个成员函数叫做常量成员函数。
常量成员函数在执行期间不能修改对象的成员变量的值(静态成员变量除外),也不能调用同类对象的非常量成员函数(同样的静态成员函数除外)。

(2)而在函数名前加const则表示函数的返回值为常量。

C++中的const关键字学习笔记的更多相关文章

  1. c++ const 关键字 学习笔记

    const简单介绍: 1不再使用c中的#define,c++默认不给const定义的变量分配内存,所以它默认的是仅本文件可以看到该变量(即internal linkage), const int bu ...

  2. C++中的const关键字

    http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...

  3. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  4. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  5. C++ 类中的const关键字

    //类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是 ...

  6. 浏览器中js执行机制学习笔记

    浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...

  7. <<C++标准程序库>>中的STL简单学习笔记

    0. 内容为个人学习笔记, 仅供参考, 如有错漏, 欢迎指正! 1. STL中的所有组件都是由模板构成的, 所以其元素可以是任意型别的. 组件有: - 容器: 管理某类对象的集合. 不同的容器有各自的 ...

  8. JavaSE中Collection集合框架学习笔记(1)——具有索引的List

    前言:因为最近要重新找工作,Collection(集合)是面试中出现频率非常高的基础考察点,所以好好恶补了一番. 复习过程中深感之前的学习不系统,而且不能再像刚毕业那样死背面试题,例如:String是 ...

  9. JS和JQuery中的事件托付 学习笔记

    事件托付事实上并非一个非常高级的技巧,比方在一个页面里面.当仅仅存在两个button的时候.可能你给button加入监听是这种:(本文不考虑浏览器兼容性.关于事件的兼容性可參考前面的学习笔记) < ...

随机推荐

  1. java基础巩固之java实现文件上传

      对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具com ...

  2. 关于js的对象原型继承(一)

    javascript中,对象的继承是通过原型去继承. 可以这样理解:js中的对象,包含的除了属性和方法,还有一个最基本的原型__proto__对象.这个原型__proto__指向谁,这个对象就继承谁. ...

  3. angular4-常用指令

    ngIf 指令(它与 AngularJS 1.x 中的 ng-if 指令的功能是等价) <div *ngIf="condition">...</div> n ...

  4. vue安装与配置

    直接引入 <script src="https://unpkg.com/vue"></script> 用npm安装   $ npm install vue ...

  5. net core 获取网站目录

    AppContext.BaseDirectory 获取项目的根目录

  6. 关于vivado implement后clock interaction报告的理解(更新中)

    对于较大工程很难避免遇到CDC问题,vivado自带的分析工具可以报告跨时钟状态. 详情参看手册UG906-Design Analysis and Closure Techniques. (1)关于p ...

  7. centos7安装配置zabbix4.0

    zabbix01    198.8.8.211    zabbix-server4.0 zabbix02    198.8.8.212    zabbix-agent4.0 一:zabbix服务端环境 ...

  8. JDK的下载及配置

    下载地址,为了兼容最好安装1.8版本 jdk1.8:http://jbox.jd.com/quickshare/d2wheyazjtdccshou2dbo24roejdk1.7:http://jbox ...

  9. transform带来的坑

    1.transform会使子元素fixed定位和absolute定位失效. 2.父元素设置了border-radius和overflow:hidden, 但是子元素有transform属性,父元素设置 ...

  10. Python&selenium&tesseract自动化测试随机码、验证码(Captcha)的OCR识别解决方案参考

    在自动化测试或者安全渗透测试中,Captcha验证码的问题经常困扰我们,还好现在OCR和AI逐渐发展起来,在这块解决上越来越支撑到位. 我推荐的几种方式,一种是对于简单的验证码,用开源的一些OCR图片 ...