1.静态类成员
声明:static int MAX; // 在类声明中
初始化:int Foo::MAX = 20; //在类定义中进行初始化
注意:对于静态类成员,无论创建了多少对象,程序都只创建一个静态成员变量副本。所有对象都共享同一个静态成员。
2.在构造函数中使用new来分配内存的时候,必须要在相应的析构函数中使用delete来释放内存。
3.当使用一个对象来初始化另一个对象的时候,将调用复制构造函数;
4.创建对象的时候总是会调用构造函数,带参数的构造函数也可以是默认构造函数,前提是所有参数都有默认值;
5.默认复制构造函数复制的是指针,这会导致两个指针指向同一份内存,当其中的一个对象被析的时候,就会导致另一个对象执行出错;
为了避免这种现象,可以显式的定义复制构造函数。用以直接复制值生成副本,此时两个指针指向两个内存,这种复制方式称为深复制,复制指针称为浅复制
6.静态类成员函数不与特定的对象相关联,因此只能够使用静态数据成员;
如果静态成员函数是在共有部分声明的,则可以使用类名和作用域解析操作符来调用。
7.如果要在派生类中重新定义基类的方法,通常应该将基类方法声明为虚的。
1 //基类 2 class foo 3 { 4 ... 5 public: 6 foo(); 7 ~foo(); 8 virtual void func(int s); //由于派生类重新定义,需添加virtual 关键字 9 ... 10 } 11 12 //派生类 13 class foo_son::public foo 14 { 15 ... 16 public: 17 foo(); 18 ~foo(); 19 virtual void func(int s); //实现不同的接口 此处virtual最好是写上 20 ... 21 }
8.关键字virtual只用在类方法声明的该函数原型之中。
9.如果使用了virtual程序将根据引用或指针的所指向的对象的类型来选择方法。
//假设基类和派生类都有方法func,基类中func带有关键字virtual foo name; foo_son mena; foo & xc = name; foo & cx = mena; xc.func(); // foo类调用 cx.func(); // foo_son类调用
10.如果在派生类中对基类的方法进行了重新定义的话,在派生类方法定义之中调用基类的方法时,需要使用作用域解析操作符来区分。
1 void foo_son:: func() //派生类重新定义基类的方法 2 { 3 foo::func() //使用作用域解析操作符 4 ... 5 }
11.使用虚析构函数可以保证正确的析构函数序列被调用,特别是在多态性的场景之下。
12.多态公有继承
1、在派生类中重新定义基类的方法
2、使用虚函数
13.如果要在派生类中重新声明基类的方法,通常需要将基类方法定义为虚的;通常也需要为基类声明一个虚析构函数;
14.派生类在初始化基类的私有数据时,采用的是成员初始化列表语法。
15.如果派生类中没有重新定义基类中的某些方法,在派生类中调用这些方法的时候就不需要使用作用域解析操作符。
16.如果派生类构造函数使用new或者new[]运算符来初始化类的指针成员,则应该定义一个赋值运算符。(什么情况下派生类应该定义赋值运算符?)
17.派生类中重新定义基类的方法,但是特征标不同,则程序将隐藏基类中的该方法;
重新定义基类中的方法应该保证函数原型完全相同,但如果函数的返回类型是基类的引用或者指针的话,则可以将派生类中返回类型修改为派生类的引用或者指针。
多重继承
18.一个派生类继承多个基类
1 class cv:public ceo,public cel{ ......};
19. 虚基类:解决继承多个间接基类的派生类中存在多个间接基类对象的问题。
1 class worker{...}; 2 class singer:virtual public worker{...}; 3 class waiter:public virtual worker{...}; 4 class singgingwaiter: public singer,public waiter{...};
singingwaiter(const worker & wk,int p=0,int v=singer::other):worker(wk),singer(wk,v),waiter(wk,p){};
如果类有间接虚基类,则除非只需要使用该虚基类的默认构造函数,否则必须显式的调用该基类的某个构造函数。
20.多重继承可能导致函数调用的二义性,可以使用作用域解析运算符
浙公网安备 33010602011771号