C专家编程--读书笔记十一 你懂得C,所以C++不在话下

第十一章
 
一、知识点
1、面向对象的关键就是把一些数据和对这些数据进行操作的代码组合在一起,并用某种手法将它们做成一个单元。
面向对象编程的特点是继承和动态绑定。C++ 通过类的派生支持继承,通过虚拟函数支持动态绑定。虚拟函数提供了一种封装类体系实现细节的方法。(P247)
 
2、面向对象编程的关键概念:(P248)
(1)、类:类是一种用户定义类型,就好像是int这样的内置类型一样。内置类型已经有了一套完善的针对它的操作(如算术运算等),类机制也必须允许程序员规定他所定义的类能够进行的操作。类里面的任何东西被称作类的成员。
(2)、对象:某个类的一个特定变量,就像j可能是int类型的一个变量一样,对象也可以被称作类的实例。
(3)、封装:把类型、数据和函数组合在一起,组成一个类。
(4)、继承:允许类从一个更简单的基类中接收数据结构和函数。派生类获得基类的数据和操作,并可以根据需要对它们进行改写,也可以在派生类中增加新的数据和函数成员。
 
3、抽象的好处:

抽象建立了一种抽象数据类型,C++使用类这个特性来实现它。它提供了一种自上而下的、观察数据类型属性的方法来看待封装:把用户定义类型中的各种数据和方法组合在一起。它同时也提供了一种自底向上的观点来看待封装:把各种数据和方法组合在一起实现一种用户定义类型。(P249)
 
4、类的名字以大写字母开头是一个很好的习惯。类和类型一样,对象和变量一样。(P251)
 
5、类就是用户定义类型加上所有对该类型进行的操作。
类经常被实行的形式是:一个包含多个数据的结构,加上对这些数据进行操作的函数的指针。编译器施行强类型——确保这些函数只会被该类的对象调用,而且该类的对象无法调用除它们之外的其他函数。(P251)
 
6、属于protected的声明的内容只能由该类本身的函数以及该类所派生的类的函数使用
属于private的声明只能被该类的成员函数使用。private声明在类外部是可见的(名字是已知的),但却是不能访问的。
另外还有两个关键字也会影响访问控制,它们是friend和virtual。这两个关键字每次只能用于一条声明,而public、protected、private这3个关键字每个后面可以跟一大串声明。另一个不同点在于:friend和virtual这两个关键字后面不跟冒号
friend:属于friend的函数不属于类的成员函数,但可以像成员函数一样访问类的private和protected成员。friend可以是一个函数,也可以是一个类;(P252)
 
7、类中的每个函数声明都需要一个实现,可以在类里面实现,也可以在类外部实现。(P252)
 
8、当成员函数在类的外部实现时,前面必须附加一些特别的前缀。这个前缀就是::,它被称为作用域解析操作符,成员函数的形式为:
返回值 类名::函数名(参数列表)(P253)
 
9、每个成员函数都有一个this指针参数,它是隐式赋给该函数的,它允许对象在成员函数内部引用对象本身。(P254)
 
10、当类的一个对象被创建时,构造函数被隐式地调用,它负责对象的初始化。与之相对应,类也存在一个清理函数,称为析构函数。当对象被销毁时,析构函数被自动调用。因为类外部的任何函数都不能访问类的private数据成员。因此,需要有一个特权函数来创建一个对象并对其进行初始化。可以在C++的类中声明多个构造函数,通过参数来区分它们。构造函数的名字总是和类的名字一样。当类的一个对象被创建时,构造函数会被自动调用,程序员永远不应该显式地调用构造函数。至于全局和静态对象,它们的构造函数会在程序开始时被自动调用,而当程序终止时,它们的析构函数会被自动调用。(P255)
 
11、继承的语法:派生类的名字后面跟一个冒号,然后就是基类的名字,如下:(P260)
class Apple : public Fruit
{
};
继承表示派生类是基类的一个变型。与嵌套类(一个较小的对象是一个较大对象的许多组成部分之一)不同,继承表示一个对象是一个更为普通的父对象的特性。
 
12、重载——作用于不同类型的同一操作具有相同的名字。它可以是函数的名字,也可以是一个操作符。(P261)
 
13、重载总是在编译时进行解析。编译器查看操作数的类型,并核查它是否是该操作符所声明的类型之一。(P262)
 
14、重载后的操作符的优先级和操作数与原先的操作符相同。(P263)
 
15、多态——运行时绑定。它的意思是支持相关的对象具有不同的成员函数(但原型相同),并允许对象与适当的成员函数进行运行时绑定。C++通过覆盖(override)支持这种机制——所有的多态成员函数具有相同的名字,由运行时系统判断哪一个最为合适。(重载是overload)。需要在成员函数前面加上virtual关键字告诉编译器该成员函数是多态的(也就是虚拟函数)。(P263)
 
16、当想用派生类的成员函数取代基类的同名函数时,C++要求你必须先通知编译器。通知的方法就是在可能会被取代的基类成员函数前面加上virtual关键字。(P265)
 
17、(P266)

18、C++允许一个常量整数来定义数组的大小:
const int size = 124;
char a[size];
这在C++中是允许的,但在C语言中却是错误的。(P271)
 
19、(1)、在C++中,用户代码不能调用main()函数,在C语言中却是允许的。
(2)、在C++中,由typedef定义的名字不能与已有的结构标签冲突,但在C语言中却是允许的(它们分属不同的名字空间)。
(3)、当void*指针赋值给另一个类型的指针时,C++规定必须进行强制类型转换,在C语言中却无必要。(P272)
 
二、问题
1、成员函数的this指针是否隐式传递给每个成员函数的第一个参数?
 
2、析构函数的使用?
posted on 2012-05-01 09:15  谷堆旁边  阅读(328)  评论(0编辑  收藏  举报