从基于对象(Object Based)过渡到面向对象(Object Oriented)是 C++ 面向对象程序设计的学习主线。
在基于对象部分通过对 C++ 两种不同的类——class without pointer member 和 class with pointer member的剖析,掌握了单一 class 的设计方法。
在面向对象部分通过阐释 classes 之间的三种主要关系——复合(Composition)、继承(Inheritance)和委托(Delegation),进而掌握多重 classes 的设计方法。
C++程序代码的基本形式:声明类的头文件 + 源文件 + 标准库的头文件。声明类的头文件需要有如下防卫式声明:
#ifndef _H_INCLUDED
#define _H_INCLUDED
......
#endif // _H_INCLUDED
头文件的布局包括:前置声明 (forward declarations)+ 类的声明 (class declarations)+ 类的定义(class definition)。类的声明包括类头(class head)与类体(class body)。类的成员函数有的定义在 class body 之内,自动成为内联函数(inline function)候选人,有的则定义在 class body 之外。
类中的成员分为数据成员和函数成员,类中的成员可分为共有、保护和私有成员,他们分别放在访问权限控制关键词 public、protected 与 private之后,以此限定其访问级别(access level)。一般将数据成员放在private之下以实现数据隐藏,默认情况下所有定义一个类中的成员是私有的。
类的每个新对象创建都需要调用其构造函数(constructor function),当创建的对象被删除时则需要调用析构函数(destructor funtion)。在构造函数的参数表中可以设置默认实参(default argument),在参数列表和函数体之间可以用初值列(initialization list)来初始化数据成员。构造函数可以重载(overloading),即函数具有不同类型的参数或具有不同个数的参数,编译器会根据参数的类型与个数为重载函数生成相异的实际名称。
class complex
{
public:
complex (double r = 0, double i = 0)
: re ( r ), im ( i )
{ }
complex ( ) : re ( 0 ), im ( 0 ) { }
......
}
如果将构造函数与拷贝构造函数均置于private之下,则不能创建新的对象实例,此时若能在类中创建一个静态私有数据成员来记录类的唯一对象实例,同时创建一个静态公有函数成员向外界提供这个唯一的对象实例,此时就形成了单例模式(Singleton)。
关键字 const 不仅可修饰普通的数据成员,还可以修饰对象成员和成员函数。使用const修饰的常量需要初值列来初始化。函数定义时在成员函数的参数列表与函数体之间加上关键字 const 则可以形成常量成员函数(const member function)。若两个函数名和参数都相同,但是其中一个函数被const修饰,则这两个函数互相重载。
常成员函数能由常对象(只有读权限)去访问,且不允许常成员函数修改对象的成员变量(没有写权限),所以不能调用非常成员函数,因为这些成员函数可能修改常对象中的成员变量。 而普通成员函数可以调用常成员函数。
1. 常对象只能调用常成员函数。
2. 普通对象可以调用常成员函数与普通成员函数。
3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针,常函数的this指针为常this指针。
4. 普通成员函数:既能调用普通成员函数,也能调用常成员函数;既能使用普通数据成员,也能使用常数据成员,但对常数据成员只用读权限。
5. 常成员函数:只能调用常成员函数;既能使用普通数据成员,也能使用常数据成员,但对常数据成员只用读权限。