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的更多相关文章

  1. 【More Effective C++ 条款1】仔细区别pointers和references

    1)操作符的差别 指针使用"*"和"->"操作符,而引用使用"."操作符 2)初始化的差别 有空指针,但是没有空引用,和const对象 ...

  2. 条款一:仔细区别pointers 和 reference

    1.一个reference必须总代表某个对象,没有所谓的null reference.如果你有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能它不指向(代表)另一个对象,那么应该使用poin ...

  3. golang 中Pointers Vs References

    原文: https://spf13.com/post/go-pointers-vs-references/ Pointers Vs References Some languages includin ...

  4. c++interview

    出自:https://github.com/huihut/interview Github    |    Docsify 简体中文    |    English 关于 本仓库是面向 C/C++ 技 ...

  5. ###《More Effective C++》- 基础议题

    More Effective C++ #@author: gr #@date: 2015-05-11 #@email: forgerui@gmail.com 一.仔细区别pointers和refere ...

  6. More Effective C++ 35 条款

    一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...

  7. C++学习书籍推荐《More Effective C++》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...

  8. More Effective C++: 01基础议题

    01:仔细区别 pointers 和 references 1:没有所谓的null reference,但是可以将 pointer 设为null.由于 reference 一定得代表某个对象,C++ ...

  9. More Effective C++笔记(一)(精心整理)

    一.基础议题 条款1:仔细区别pointers和references 指针使用*和->,引用使用"." 引用必须指向一个已初始化的对象,不能为null,而指针可以指向某个对象 ...

随机推荐

  1. linux中waitpid及wait的用法

    wait(等待子进程中断或结束) 表头文件      #include<sys/types.h>      #include<sys/wait.h> 定义函数 pid_t wa ...

  2. 浅淡C/C++中的typedef和#define

    在C/C++中,我们平时写程序可能经常会用到typedef关键字和#define宏 定义命令,在某些情况下使用它们会达到相同的效果,但是它们是有实质性的区别,一个是C/C++的关键字,一个是C/C++ ...

  3. Mondriaan's Dream(POJ 2411状态压缩dp)

    题意:用1*2的方格填充m*n的方格不能重叠,问有多少种填充方法 分析:dp[i][j]表示i行状态为j时的方案数,对于j,0表示该列竖放(影响下一行的该列),1表示横放成功(影响下一列)或上一列竖放 ...

  4. String.Format格式说明

    原文地址:http://www.cnblogs.com/tuyile006/archive/2006/07/13/449884.aspx C#格式化数值结果表 字符 说明 示例 输出 C 货币 str ...

  5. linux常用命令之--文本编辑和文本内容查看命令

    linux的文本编辑和文本内容查看命令 1.文本编辑命令 vi:用于编辑文本文件,基本上可以分为三种模式,分别是一般模式.编辑模式.命令行模式. 一般模式:当编辑一个文件时,刚进入文件就是一般模式. ...

  6. JDBC第一天连接池案例

    JDBC,JDBC的工具类JDBC 连接从连接池中拿: 创建连接池的语句: package day01; import java.sql.Connection; import java.sql.Dri ...

  7. C#调用C++导出类(转)

    由于使用别人的Dll,导出的是一个实体类,在C#里封送很难,百度下,有个朋友回复一篇英文的,虽然不一定使用,但可以作为一个知识点,现把原文贴下: c#调用C++写的dll导出类,包含继承,重载等详细介 ...

  8. 你今天Python了吗?(下)

    在体验了wxPython的强大之后,让我们把注意力集中到Twisted上来.在C++的世界里,你会发现一个很棒的网络应用框架,那就是ACE了:在Python的地盘,Twisted则是在网络应用框架中当 ...

  9. Codeforces Round #363 (Div. 1) C. LRU

    题意: n个数,长度为k的缓存,每次询问,每个数以pi的概率被选,如果不在缓存区则加入,如果缓存区满了,则第一个进缓存的出来,问10^100次询问以后每个数在缓存的概率 思路: 状压DP,看了hzwe ...

  10. Python 学习笔记(四)正则、闭合、生成器

    (一)正则表达式 基本规则: ^ 匹配字符串开始位置. $ 匹配字符串结束位置. \b 匹配一个单词边界. \d 匹配一个数字. \D 匹配一个任意的非数字字符. x? 匹配可选的x字符.换句话说,就 ...