1、面向对象
面向对象编程总结为一句话:向对象发送消息。
面向对象的程序模块由类构成。
2、类
(1)每个类都定义可一个接口和一个实现。
接口:有该类地代码需执行地操作组成。实现:包括该类所需要地数据。
(2)定义数据成员
不能把数据成员(像定义变量一样)的初始化作为其定义地一部分,只能指定数据成员地名字和类型。只能通过构造函数地特殊成员函数控制初始化。
(3)struct和类
C++中struct也可以有public、private和protect属性。struct成员默认为public,而class成员默认为private。
(4)private和protect
private:只有该类的创建者和该类的内部成员函数可以访问
protect:继承的结构可以访问。
(5)成员函数
成员函数是类的行为,是程序算法实现的部分,是对封装的数据进行操作的唯一途径。成员函数的声明是在类主体中;具体实现在类定义之外,并且要指明类的名称。ex:
return_type calss_nane::func(type parameter)
{
body
}
(6)内联成员函数
隐式申明: 将函数主体直接放在类主体内。
显示声明: 在类主体外实现--函数实现时加上inline关键字。
(7)对象
对象是该类类型的某一特定实体。声明: 类型 对象名
申明了类及其对象,就可以访问对象的公有成员: 对象名.公有成员函数名(参数表)
(8)构造函数
是一个特殊的成员函数,定义如何初始化该类的对象。它将在对象创建时被系统自动调用。
构造函数的函数名和类名相同,且没有返回值。
若没定义构造函数, 编译器会自动生成一个默认的构造函数。
定义好构造函数后,可以这样声明并初始化对象: 类名 对象名(参数列表)
(9)拷贝构造函数
是一种特殊的构造函数,具有一般构造函数的特性,其形参是本类对象的引用。其作用是使用一个已存在的对象去初始化一个新的同类的对象。
若没有定义拷贝构造函数,系统会自动生成一个默认的构造函数,其功能是把初始值对象的每个数据成员的值都复制到新建的对象中。ex:
class point{
public:
point(int x = 0, y = 0); //构造函数(需要在类外实现)
point(point &p); //拷贝构造函数(需要在类外实现)
private:
......
};
(10)析构函数
用来完成对象被删除前的清理工作。在对象的生存周期结束的时候由系统自动调用。若为显示定义,系统将自动生成一个不做任何事的默认析构函数。
ex: ~clock(){}
(11)类的组合
一个类内嵌其他类的对象作为成员。组合构造函数定义:
类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表),…… { 类的初始化}
对本类的数据成员也可以这样初始化,ex: 类名::类名(形参表):数据成员(值)
(12)类模板
为类申明一种模式,使得类中的某些数据成员、成员函数的参数或返回值能取任意类型。示例:
template <class T> //类模板:实现对任意数据类型的数据进行存取
class store {
private:
T item; //item用于存放任意数据类型的数据
int value;
public:
......
} ;
模板类的成员函数必须是模板函数。默认形式构造函数的实现
template <class T>
store <T>::store(void):value(0)
{ }
(13)类的静态数据成员
类的普通数据成员在类的每一个对象中都拥有一份拷贝。
类的静态数据成员,采用static声明;每个类只有一个拷贝,由该类的所有对象共同维护和使用,实现了不同对象间的数据共享。静态数据成员不属于任何一个对象,所以只能通过“类名::标识符进行访问”
(14)类的静态函数成员
a、对普通函数成员的调用必须通过对象名。对以公有的静态成员函数可以通过类名或对象名两种方式来调用。
b、静态成员函数可以直接访问该类的静态数据和函数成员;而访问非静态数据成员,必须通过对象名来访问(麻烦啊)。
(15)友元
a、友元函数:在类声明中由关键字frined修饰的非成员函数。友元函数不是本类的成员函数,在它的函数体中可以通过对象名访问类的私有和保护成员。
b、友元类:若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
class B {
...
friend class A;
...
};
(16)继承与派生
继承,是新的类从已有的类那里得到的以后特性。从已有类(基类)产生新类(派生类)的过程就是派生。派生类声明示例:
class Drive : public Base1,private Base2 //派生类Drive分别以public和private的方式继承基类Base1和Base2
{
public:
Drive(); //添加类构造函数(基类中的构造函数和析构函数是不能被继承下来的)
~Drive();
} ;
a、派生类生成过程:
吸收基类成员、改造基类成员、添加新的成员
b、访问控制:
公有继承、私有继承、保护继承。(任何情况基类的私有成员通过派生类都是不能访问的)
c、作用域分辨符“::”:
解决同名情况下对基类成员的访问的二义性。
Drive.info //访问Dirve的类成员
Drive.Base::info //访问Drive基类的类成员
d、虚基类
将共同基类设置为虚基类,这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样就解决了同名成员的唯一标识问题。
如果虚基类定义有非默认形式的构造函数,在所有派生类中都必须在构造函数的成员初始化表中列出对虚基类的初始化。(在建立对象时,只有最远派生类的构造函数会调用虚基类的构造函数)
(17)多态
多态是指同样的消息被不同类型的对象接收时导致完全不同的行为。分为:重载多态、强制多态、包含多态和参数多态。
a、运算符重载(实质是函数重载)
表达形式: 返回类型 operator 运算符(参数表){ }
作为类成员的重载函数时,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。
b、虚函数
虚函数是以virtual修饰的成员函数(不能将构造函数声明为虚函数),以实现多态性。
c、纯虚函数
纯虚函数是一个在基类中声明的虚函数,没有函数体(即基类中不再给出函数的实现部分),它在基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本。
d、抽象类:带有纯虚函数的类
(17)this指针
指向本类对象的隐含指针。