今日偶得一书,《c++面向对象高效编程》(人民邮电出版社出版发行,美Kayshav Dattatri著,潇湘工作室译)。虽然以前学过c++但是最近一直用delphi,因为一直觉得vc里面有太多的东西不懂就没了兴趣,直到看了这本才感觉c++(单纯的语言)原来是这么有趣,于是又兴起了学习c++的强烈欲望。首先说一点,我这人往往心里一热感觉就来了,可是什么时候感觉会消失连我自己却也不知道。也许明天,也许一个小时后,呵呵,谁知道呢?不管那么多了,还是先看吧,因为我觉得这本书的确不错哦!呵呵。
为了改变以往的看书习惯,这次我决定做一下笔记,也许这能够让我坚持久一点点呢。如果你能看到,那就共同学习进步吧,我里面还有好多不明白的地方,也有好多可能理解错误的地方。盼遇高手指教,先行谢过了,嘿嘿!
---------------Rainspider(饶春阳)《c++面向对象高效编程》读书笔记
2005.06.13
一、面向对象的oop与思想
1、对象是类的一个或多个实例
程序运行中每个对象都保存有自己的数据副本,数据成员不共享(静态数据成员除外)。但是仅仅存在一份成员函数的实现代码的副本,各个对象(基于同一类)之间相互共享。
2、类的目的
一个设计优秀的类必须易于理解和使用,而不仅仅是一些纯函数的集合或者数据结构的“类”封装。一个类的良好实现不应该允许客户直接访问或者修改对象的状态(数据成员),状态只能由成员函数来修改,而客户只能使用那些合法的可以被客户使用的成员函数来操作对象。
3、继承和聚合
继承:从一般到特殊
聚合:一般在设计密封和共享
4、面向对象语言的特性:
支持数据抽象;封装;继承
继承是区别基于对象的语言和面向对象的语言的关键功能。
5、构造函数和析构函数是特殊的成员函数,没有任何返回值。
6、类中的函数:
1、构造函数;可以重载
2、析构函数;唯一性
3、复制构造函数;从现存对象中创建一个新的对象
4、赋值运算符;将现存对象明确的赋给另外一个现存对象
(以上函数在没有明确定义的情况下编译器会自动产生,但是往往不符合正确的要求,所以要求类的创建者定义)
5、运算符函数;运算符重载
6、一般成员函数(动态或者静态的)
2005.06.14
一、复制构造函数
1、在对象之间直接赋值的时候;clsssa a=b,定义a并且赋值,调用a的复制构造函数来实现。
2、把对象作为参数按值传送时,fun(classa a);为了实现形式参数的拷贝要自动调用复制构造函数。
*编译器自动调用复制构造函数。
二、在内存中创建一个新对象:
1、编译器得到对象本身所需要的内存(或程序员使用new显式分配需要的内存);
?此时内存中的数据未知;
2、将原始内存转换为对象,将数据成员或函数指针(有虚函数时)放置到位;
3、对这个对象调用其构造函数。
三、对象的释放
1、对于编译器自动创建的对象,在超出生命期后会自动释放:
a、先调用析构函数释放该对象在生存期内所申请的任何资源;(这样的析构函数释由程序员负责)
b、编译器释放对象本身所占内存,完成该对象的释放。
2、对于使用new显式创建的对象,必须手动释放
a、使用delete函数释放(相当于告诉编译器去执行1.a和1.b)。
四、赋值运算符“=”
1、对于语言内建的简单变量,如int,char会自动调用右值去覆盖左值;
2、对于对象,在没有定义的时候编译器会自动产生一个赋值运算符的实现函数,但是通常情况下需要自己来定义才符合要求;
对于obja=objb,可能objb中不仅仅包含对象本身的成员数据,还可能有其所拥有的其他资源或者数据。
为保证完成操作后两者所含内容完全一样,需要人工指定赋值运算符的函数实现。
对于右对象(源)中或者左对象中有其他除对象本身外的任何资源的情况,一般必须在实现函数中先释放左对象的资源再重新申请(和源大小相同)再进行复制。可以避免内存泄露或者出现无正常可用内存的情况发生。
六、一些需要注意的地方:
1、重载函数防止出现二义性;
2、析构函数只能有一个;
3、在实现赋值运算符函数的时候必须防止有a=a的情况发生,可通过核对左右对象的地址来判断;
4、赋值操作a=b后(赋值运算符函数)必须返回对对象a的引用。否则a=b=c将不能实现。
;-------------------------------------;
;以下笔记将按书上章节顺序编号;
;-------------------------------------;
3.5 this指针和名称修正
类的成员函数由编译器象实现其他函数一样来对待,这就引出:
1、为保证所实现的成员函数能够访问到调用它的对象,该对象的地址总是作为this指针传递到函数的第一个参数。不管你有没有在函数声名中指出这个参数,编译器总是把它放在所有参数的前面。
2、为保证任意一函数都有自己特定的名称,编译器会进行名称修正。了解名称修正有助于查看连接器的输出信息。