是摘录,所以只是自己感兴趣的部分,一般是自己不熟悉的地方和觉得讲述的很好的地方。
第六章 函数设计
> 如果函数没有参数,则用void 填充.明确的告诉别人,此函数没有参数。
> 有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。
例如字符串拷贝函数strcpy 的原型:
char *strcpy(char *strDest,const char *strSrc);
> 断言用来捕捉程序员认为不应该发生的情况
在编写函数时,先自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
> int m;
int & n = m;
n 相当于m 的别名(绰号),对n 的任何操作就是对m 的操作。例如有人名叫王小毛,
他的绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。
引用和指针的区别:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
> 实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?
答案是“用适当的工具做恰如其分的工作”。
指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。如果只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利,从而产生潜在的危险。
第7 章 内存管理
> C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
> 当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针
> 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。因为编译器总是要为函数的每个参数制作临时副本,指针亦同。
>
第9 章 类的构造函数、析构函数与赋值函数
> 构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表
位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体
内的任何代码被执行之前。
> 如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。
> 类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式
来初始化
> 构造从类层次的最根处开始,在每一层中,首先调用基类的构造函数,然后调用成
员对象的构造函数。析构则严格按照与构造相反的次序执行,该次序是唯一的,否则编
译器将无法自动执行析构过程。
> 一个有趣的现象是,成员对象初始化的次序完全不受它们在初始化表中次序的影响,
只由成员对象在类中声明的次序决定。这是因为类的声明是唯一的,而类的构造函数可
以有多个,因此会有多个不同次序的初始化表。如果成员对象按照初始化表的次序进行
构造,这将导致析构函数无法得到唯一的逆序。
> 注意不要将检查自赋值的if 语句
if(this == &other)
错写成为
if( *this == other)
> 如果我们实在不想编写拷贝构造函数和赋值函数,又不允许别人使用编译器生成的
缺省函数,怎么办?偷懒的办法是:只需将拷贝构造函数和赋值函数声明为私有函数,不用编写代码。
<边看边补充>
posted on 2008-07-29 17:32 hATEmATH的网上田园 阅读(1126)
评论(5) 编辑 收藏