理解灵活而奇特的C++-ch09

1.引用?

引用的概念:引用就是被引用变量的别名,这就意味着被引用变量可以通过两个或多个命名标识符访问内存,故这些命名标识符的内存地址是相等的,引用可以视为隐式的指针变量。但是没有指针变量的解引用和对变量的取    地 址的麻烦。下面是引用变量的一些结论和使用误区:

C1:引用变量必须在声明的时候就有初值,这个初值有两层含义。被引用内存的值和地址。并且,一旦引用,终身引用。即引用变量一旦引用了一个内存,不能再引用别的内存。注意和用别的变量来赋值的区分。比如:

T x=...,y=...

T& refx=x;        表示refx和x共享同一片内存。

refx=y;                表示修改引用内存中的值,而不是该向引用y的内存。等价于x=y;

C2: 同指针变量一样,多个引用变量可以共享统一内存,在这些引用变量的任何一个对共享内存(数据)的修改在其他的所有引用变量可见。

C3:const  T&不能修改引用内存(内存中的数据),但是可以读取。

C4 :引用变量的对象可以提高函数参数传递和从函数返回的效率,从而避免了赋值内存,而是复制内存地址,相当于在同一内存上的操作。对于对象而言,更是避免了函数参数(以对象)传递和返回对象因为赋值对象而调用复制构造函数的开销。但是非const引用可能不经意间修改内存,那么const T&更为常用。const T&的特点那就是更安全、更高效。

C5:引用可以想象成不能改指的指针。T* const.

C6:基于申明引用的同时就要初始化引用变量(让它引用被引用变量的内存)考虑,类中的引用数据成员必须用成员初始化器初始化引用数据成员。事实上,使用成员初始化器初Ctor,始化成员的好处远不止这些。

C7:const T&可以引用右值(又叫右值引用),右值通常是一些const对象/变量、常量、临时变量或对象、未命名的内存(无名变量)等,而左值引用恰好相反,它必须引用一个清晰定义了的内存,即合法的命名内存(因为计算机按名存取变量)。

C8:可以对任意数据类型的变量引用,甚至是指针变量(指针的引用,引用的是一个指针变量)。但是无法声明引用的引用(&&)和指向引用的指针。

C9:最后一点,引用应该尽可能引用一个合法标识符标示的未被释放(注销或销毁)的内存。因为,被引用的变量消失,引用失效。这可能导致一些难以预料或不可诊断的BUG,或一些标准以外的未定义行为发生。

总之,决定引用变量引用哪个内存(变量)的唯一之处就是在声明引用变量时,初始化的那个内存缓冲区。

编程箴言,引用比指针安全,const引用比非const引用安全。引用劣于指针的一点大概就是,指针变量可以改指,引用变量绝不可能改指。

2.文本?

3.文本表达式?

4.静态(static)?

5.外部(extern)?

6.类型定义(typedef)

7.类型别名(aliases)?

8.类型转换?

9.作用于解析?

10.统一初始化?

11.可选函数语法?

12.空指针文本?

13.尖括号?

14.初始化列表?

15.显示转换运算符?

16.特性?

17.用户自定义的文本?

18.可变参数列表?

19预处理宏?

时间: 2024-11-03 21:39:29

理解灵活而奇特的C++-ch09的相关文章

C++ 编程思想(第一卷)阅读总结

最近工作闲翻阅了之前买f<C++编程思想>这里贴上我认为对我最有帮助的部分,一来留给自己复习看,另一方面也和小伙伴们分享下: 1 OPP相关 1.1.每个对象都有一个类型,OOP中class 和type是同义词,在面向对象的程序设计中,我们所做的工作实际上就是创造新的数据类型,程序员定义class 是为了与具体问题相适应,而不是被迫适用已存在的数据类型. 1.2.当用<>来指定文件时,预处理器以特定的方式来寻找文件,一般是环境中或者编译器命令指定的某种寻找路径:当采用"&

深入理解maven与应用(二):灵活的构建

深入理解maven及应用(一):生命周期和插件 参考官方url:http://maven.apache.org/guides/index.html 一个优秀的构建系统必须足够灵活,应该能够让项目在不同的环境下都能成功构建.maven为了支持构建的灵活性,内置了三大特性,即:属性.profile和资源过滤. 1.maven属性 maven属性分6类: 1.内置属性:如${basedir}表示项目根目录,${version}表示项目版本 2.POM属性:用户可以引用pom文件中对应的值.如: ${b

汇编leal命令的灵活用法及理解

AT&T里leal的命令有一些灵活的用法,它具有两种作用: 1,将有效地址写入到目的操作数. 2,可以简洁地描述普通的算术操作. 例子: 1)leal -4(%ebp), %eax 这个是不是把ebp里面存储的地址减去4了之后放在eax里. 2)leal 0x0(,%ebx,4), %edx (假设ebx里面存的是x) 那么根据代码,它的效果是edx里的值是4*x. 个人觉得可以这样理解.如果你的%ebx存的是存储器里的一个数的地址,那么使用leal指令的用法就是加载有效地址到目的操作数,属于用

灵活理解思科三层结构

刚刚看了学院的CCNA视频教程,下面做个简单记录: 1.思科网络分层: a.作用:个人干个人的事情,大家协作起来好做事.谁出了问题,我就去找谁,不用胡子.眉毛一把抓. b.分成三层:接入层.分配层.核心层. c.网络分层是逻辑上的,不是物理上的 d.网络分层一般是在设计网络时候使用,而不是在实际应用上使用. 2.核心层 核心层的作用就是速度和稳定,它需要做的事情非常少,就是很快的把东西从A这里转到B这里. 3.分配层 分配层的作用: a.路由 b.工具的实现:访问列表.包过滤.排序 c.网络安全

JavaScript - javascript 中的 &quot;||&quot; 与 &quot;&amp;&amp;&quot; 的理解与灵活运

你肯定见到过这样的代码:a = a||"xxx". 它其实就等价于下面三种形式的代码: a = a || "xxx"; 与: if (!a) { a = "xxx"; } 和: if (a == null || a == "" || a == undefined) { a = "xxx"; } 如何理解三种代码.首先必须理解一个问题: javascript 中的数据类型在与bool类型转换时候发生了什么?

OpenGL理解

说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的

深入理解JavaScript,这一篇就够了

JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写一篇关于 JavaScript 方面的东西,但是在博客园中,写 JavaScript 的文章是最多的,从入门的学习笔记到高手的心得体会一应俱全,不管我怎么写,都难免落入俗套,所以迟迟没有动笔.另外一个原因,也是因为在 Ubuntu 环境中一直没有找到很好的 JavaScript 开发工具,这种困境直到 N

深度理解div+css布局嵌套盒子

1. 网页布局概述 网页布局的概念是把即将出现在网页中的所有元素进行定位,而CSS网页排版技术有别于传统的网页排版方法,它将页面首先在整体上使用<div>标记进行分块,然后对每个快进行CSS定位以及设置显示效果,最后在每个块中添加相应的内容.利用CSS排版方法更容易地控制页面每个元素的效果,更新也更容易,甚至页面的拓扑结构也可以通过修改相应的CSS属性来重新定位.  2. 盒子模型 盒子模型是CSS控制页面元素的一个重要概念,只有掌握了盒子模型,才能让CSS很好地控制页面上每一个元素,达到我们

理解Linux系统/etc/init.d目录和/etc/rc.local脚本

本文英语版本来自:http://www.ghacks.net/2009/04/04/get-to-know-linux-the-etcinitd-directory/ 以下内容是作者自己的翻译版本,如需转载到CSDN外其他网站,请注明本文链接.  一.关于/etc/init.d 如果你使用过linux系统,那么你一定听说过init.d目录.这个目录到底是干嘛的呢?它归根结底只做了一件事情,但这件事情非同小可,是为整个系统做的,因此它非常重要.init.d目录包含许多系统各种服务的启动和停止脚本.