【More Effective C++ 条款1】仔细区别pointers和references
1)操作符的差别
指针使用“*”和“->”操作符,而引用使用“.”操作符
2)初始化的差别
有空指针,但是没有空引用,和const对象一样,引用一旦定义就必须和对象绑定(当然char* pc=0;char& rc=*pc;也合法但无意义)
由此造成的影响:
2.1)对于指针的向下转型,如果失败则返回空指针,但由于没有空引用的说法,所以对于引用的向下转型如果失败则会抛异常
2.2)由于引用不能为空,所以对于引用的使用不需要测试其有效性,而对于指针的使用往往要测试其是否为空
3)赋值的差别
对于指针可以重新赋值,而对于引用,一旦初始化就不能再与其他对象绑定
4)语法的差别
指针存的是地址,使用时需要解引用,而引用则是别名
5)总结
“当你需要考虑“不指向任何对象”的可能性时,或是考虑“在不同的时间指向不同的对象”的能力时,你应该采用指针,当你确定“总是会代表某个对象”,而且“一旦代表了改对象就不能够再改变”,那么你应该选用引用”
“当你知道需要指向某个东西,而绝对不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由指针完成,你就应该选用引用,任何其他时候,请采用指针”
6)补充
尽管引用一直被称作是别名,但其实引用也是占空间的,这个可以通过将一个引用封装在一个类中看出(占4个字节),而直接对引用取地址和取大小得到的是被引用对象的地址和大小
int x=10;
class A
{
int &r=x;
}; int main()
{
cout<<sizeof(A)<<endl;//4
A a;
cout<<sizeof(a)<<endl;//4
}
【More Effective C++ 条款1】仔细区别pointers和references的更多相关文章
- 【M1】仔细区别pointers和references
1.引用必须初始化,而且不能修改指向,这一点和const对象十分相似. 2.引用和指针用法不同,对于引用int& ri = a; rhs是个对象,引用前面加&:对于指针,int* pi ...
- 条款一:仔细区别pointers 和 reference
1.一个reference必须总代表某个对象,没有所谓的null reference.如果你有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能它不指向(代表)另一个对象,那么应该使用poin ...
- More Effective C++ 条款0,1
More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...
- [More Effective C++]条款22有关返回值优化的验证结果
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...
- golang 中Pointers Vs References
原文: https://spf13.com/post/go-pointers-vs-references/ Pointers Vs References Some languages includin ...
- Effective C++ -----条款19:设计class犹如设计type
Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新typ ...
- Effective C++ 条款08:别让异常逃离析构函数
1.别让异常逃离析构函数的原因 <Effective C++>第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常.多个异常同时存在的情况下, ...
- Effective C++ 条款42
本节条款我们讨论一下class 关键字和typename关键字的不同以及对于模板函数(template function)的影响. 例如以下代码: template<class T> T ...
- Effective C++ -----条款28:避免返回handles指向对象内部成分
避免返回handles(包括reference.指针.迭代器)指向对象内部.遵守这个条款可增加封装性,帮助const成员函数的行为像个const,并将发生“虚吊号码牌”(dangling handle ...
随机推荐
- Spring笔记01
spring 第一章 Spring模块规划图 核心架包 spring-beans-4.0.0.RELEASE. spring-core-4.0.0.RELEASE. spring-context-4. ...
- VMware 虚拟机网络配置
随手记: 近期需要安装几个服务器,编写负载均衡NLB的教程,使用到虚拟机: VMware-workstation-full-15.0.2-10952284.exe cn_windows_server_ ...
- delphi消息发送字符串
delphi消息发送字符串 其实不论什么方法,归根揭底都是通过传递对象的指针来达到效果的. 方法一: procedure SendString(strMSG: string);var Data: t ...
- 剑指offer 9-10:青蛙跳台阶与Fibonacii数列
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 问题分析 我们将跳法个数y与台阶数n视为一个函数关系,即y=f(n). ...
- jQuery的$().each()与$.each()的区别
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- python 的三元操作符
条件表达式(三元操作符) 1.有了这个三元操作符的条件表达式,你可以使用一条语句来完成下面的条件判断和赋值操作: x,y=4,5 if x<y: temp = x else: temp = ...
- Ubuntu环境下载程序到STM32
1 JLink方式 1.0 下载JLink 传送门:SEGGER官网 图1.0 下载JLink 1.2 安装JLink 双击打开下载文件:JLink_Linux_V644i_x86_64.deb 1. ...
- csp 201403-2
代码: #include<iostream> using namespace std; ];//记录的是当前窗口在哪个顺序 int n,m,x,y; struct area{ int x1 ...
- day4_变量和作用域
全局变量与局部变量: 全局变量: 定义变量时,变量左边没有缩进,就是全局变量,可以被当前py文件的任何地方给引用 局部变量: 有缩进的变量就是局部变量 函数的作用域: def test1(): age ...
- selenium 简介 及浏览器配置
简介: Selenium是一款基于web应用程序的开源测试工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.Selenium是一个自动化的web应用功能测试工具. Seleniu ...