【M1】仔细区别pointers和references
1、引用必须初始化,而且不能修改指向,这一点和const对象十分相似。
2、引用和指针用法不同,对于引用int& ri = a; rhs是个对象,引用前面加&;对于指针,int* pi = &a; rhs是个对象地址,指针前面加*。注意:引用往往是用指针实现的,从int& ri = a; 可以认为a赋给ri,再取地址。
3、引用是一个对象的别名,不能指向为空,而且自始至终是这个对象的别名。指针是地址,可以指向为空,也可以指向不同的对象。
4、考虑对引用初始化:引用是一个对象的别名。引用不能指向为空,但是通过一定技巧,可以让引用指向为空。考虑,先让指针指向为空(0),解引用赋值给引用,那么这个引用就指向为空。如下:char* pc =0; char& rc = *pc; 这将导致未定义行为。对引用初始化,必须是下面的情况之一:
a、右端是一个对象。如果是常量(包括文本常量和具名常量),只能初始化const引用,因为常量不能修改。如果不是常量,可以初始化const引用或者non-const引用。
b、右端是另一个引用。
5、考虑对指针初始化和赋值:指针是个地址,本身就是一个int值。但是,不能使用int值赋值给指针(0除外)。对指针初始化或者赋值,rhs必须是下面的情况之一:
a、赋值为0,表示为空,不能使用其他int值,如果非要使用,必须使用reinterpret_cast进行转化。
b、另一个指针。
c、对一个对象取地址。
d、使用new 返回一个地址。
6、重载操作符返回引用。比如[],v[5] = 10; 如果返回指针,必须这样写 *v[5] = 10; 这显然很别扭。
7、考虑下面的情况:资源管理对象,内部有一个指针,指向heap对象。现在交换两个资源管理对象,该怎么做?
这种情况,只需要交换指针值就好了,不需要对指向的对象内容进行交换。举例来说,甲有房间钥匙501,乙有房间钥匙502,现在要求甲乙换房。如果你去把501房间和502房间的家具家电进行交换,那你也太傻了。简单的做法是,让甲乙二人交换一下房间钥匙就好了。
8、思考,指针本身是int值,表示一个地址,那么问题来,不同类型的指针到底有什么区别呢?
表示方法和内容没有区别,只是表明,指向不同的类型。这其实告诉编译器,应该怎么样去解释这个地址的内存大小和布局。也就是说,告诉编译器,把它指向的内容当作什么类型来看待。
【M1】仔细区别pointers和references的更多相关文章
- 【More Effective C++ 条款1】仔细区别pointers和references
1)操作符的差别 指针使用"*"和"->"操作符,而引用使用"."操作符 2)初始化的差别 有空指针,但是没有空引用,和const对象 ...
- 条款一:仔细区别pointers 和 reference
1.一个reference必须总代表某个对象,没有所谓的null reference.如果你有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能它不指向(代表)另一个对象,那么应该使用poin ...
- golang 中Pointers Vs References
原文: https://spf13.com/post/go-pointers-vs-references/ Pointers Vs References Some languages includin ...
- c++interview
出自:https://github.com/huihut/interview Github | Docsify 简体中文 | English 关于 本仓库是面向 C/C++ 技 ...
- ###《More Effective C++》- 基础议题
More Effective C++ #@author: gr #@date: 2015-05-11 #@email: forgerui@gmail.com 一.仔细区别pointers和refere ...
- More Effective C++ 35 条款
一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...
- C++学习书籍推荐《More Effective C++》下载
百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...
- More Effective C++: 01基础议题
01:仔细区别 pointers 和 references 1:没有所谓的null reference,但是可以将 pointer 设为null.由于 reference 一定得代表某个对象,C++ ...
- More Effective C++笔记(一)(精心整理)
一.基础议题 条款1:仔细区别pointers和references 指针使用*和->,引用使用"." 引用必须指向一个已初始化的对象,不能为null,而指针可以指向某个对象 ...
随机推荐
- linux中waitpid及wait的用法
wait(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t wa ...
- 浅淡C/C++中的typedef和#define
在C/C++中,我们平时写程序可能经常会用到typedef关键字和#define宏 定义命令,在某些情况下使用它们会达到相同的效果,但是它们是有实质性的区别,一个是C/C++的关键字,一个是C/C++ ...
- Mondriaan's Dream(POJ 2411状态压缩dp)
题意:用1*2的方格填充m*n的方格不能重叠,问有多少种填充方法 分析:dp[i][j]表示i行状态为j时的方案数,对于j,0表示该列竖放(影响下一行的该列),1表示横放成功(影响下一列)或上一列竖放 ...
- String.Format格式说明
原文地址:http://www.cnblogs.com/tuyile006/archive/2006/07/13/449884.aspx C#格式化数值结果表 字符 说明 示例 输出 C 货币 str ...
- linux常用命令之--文本编辑和文本内容查看命令
linux的文本编辑和文本内容查看命令 1.文本编辑命令 vi:用于编辑文本文件,基本上可以分为三种模式,分别是一般模式.编辑模式.命令行模式. 一般模式:当编辑一个文件时,刚进入文件就是一般模式. ...
- JDBC第一天连接池案例
JDBC,JDBC的工具类JDBC 连接从连接池中拿: 创建连接池的语句: package day01; import java.sql.Connection; import java.sql.Dri ...
- C#调用C++导出类(转)
由于使用别人的Dll,导出的是一个实体类,在C#里封送很难,百度下,有个朋友回复一篇英文的,虽然不一定使用,但可以作为一个知识点,现把原文贴下: c#调用C++写的dll导出类,包含继承,重载等详细介 ...
- 你今天Python了吗?(下)
在体验了wxPython的强大之后,让我们把注意力集中到Twisted上来.在C++的世界里,你会发现一个很棒的网络应用框架,那就是ACE了:在Python的地盘,Twisted则是在网络应用框架中当 ...
- Codeforces Round #363 (Div. 1) C. LRU
题意: n个数,长度为k的缓存,每次询问,每个数以pi的概率被选,如果不在缓存区则加入,如果缓存区满了,则第一个进缓存的出来,问10^100次询问以后每个数在缓存的概率 思路: 状压DP,看了hzwe ...
- Python 学习笔记(四)正则、闭合、生成器
(一)正则表达式 基本规则: ^ 匹配字符串开始位置. $ 匹配字符串结束位置. \b 匹配一个单词边界. \d 匹配一个数字. \D 匹配一个任意的非数字字符. x? 匹配可选的x字符.换句话说,就 ...