3、有两种引用方式
(1)对象名.静态成员。 (2)类名::静态成员。 [2006春]选择题27 D
三、类的构造函数和析构函数。
[考试要求](一)构造函数的概念及作用;★★★ [主要知识点]
1、概念及作用:建立对象时,对数据成员初始化的成员函数。 2、特征:
①无函数类型; ②与类同名;
③建立对象时自动调用,调用时建立对象。 [考试要求](二)析构函数的概念及作用;★★ [主要知识点]
1、概念及作用:用于撤消对象的成员函数。 2、特征:
①无函数类型; ②名称:~类名;
③无参,不可以重载;
④释放给指针成员分配的动态空间。 [试题]
[2006秋]选择题23 A
[考试要求](三)缺省构造函数、类型转换构造函数和拷贝构造函数及其应用。★★ [主要知识点] 1、缺省构造函数
(1)未定义构造函数时由系统自动产生的构造函数; (2)定义的没有参数的构造函数;
(3)定义的所有参数都有缺省值的构造函数。 [试题]
[2006秋]选择题25 C
2、类型转换构造函数:通过构造函数把其他类型的数据转换成该类型的对象,选用于 (1)构造函数只有一个参数;
(2)构造函数虽然有多个参数,但只有一个参数没有缺省值。 3、拷贝构造函数:用已有对象初始化新产生的对象,有两种形式: (1)类名 新对象=已有对象; (2)类名 新对象(已有对象)。
与同类对象赋值的区别是赋值是把已有对象赋给已有对象:已有对象=已有对象。 [试题]
[2007秋]选择题28 C [考试要求]四、友元。★★ [主要知识点]
1、友元函数:类中定义或类中说明、类外定义的外部函数,是类的非成员函数,但可以访问类中任何访问权限的成员。它与成员函数的区别如下:
(1)定义和说明格式不同; ①类中定义
成员函数——类型 函数名(形参){函数体}
友元函数——friend 类型 函数名(形参){函数体} ②类中说明
成员函数——类型 函数名(形参);
友元函数——friend 类型 函数名(形参); ③类外定义
成员函数——类型 类名::函数名(形参){函数体} 友元函数——类型 函数名(形参){函数体}
(2)传递对象方式不同:成员函数通过this指针传递,由于不是类的成员函数,没有this指针,必须把成员函数通过this指针传递的对象通过对象参数传递给友无函数。
(3)函数中使用成员方式不同:在成员函数中可以直接使用成员,在友元函数中必须通过对象使用成员(对象.成员)。
(4)函数的调用方式不同:成员函数必须通过对象(对象地址、指针)调用(对象.成员函数或指针->成员函数),而友元函数只能直接调用。 [试题]
[2006春]填空题3 (2)封装性或隐藏性 [2006秋]填空题2 (2)封装性或隐藏性
2、友元成员函数:某类的友元函数是另一个类和成员函数。
3、友元类:某类(A)的所有成员函数都另一个类(B)的友元函数,则称类A是类B的友元类。
五、派生类及其应用。
[考试要求](一)继承和派生类的概念;★★ [主要知识点]
1、派生:从一个已有的类(基类、父类)产生一个新类(派生类、子类),派生类中除了新定义的成员外,还包含基类的成员。
2、继承分单继承(只有一个基类)和多继承(有多个基类),并且派生类可以作为基类派生出新类,一个基类也可以派生出不同的子类。
3、派生类中派生成员的访问权限由其在基类中原有的访问权限和派生方式共同决定。 [试题]
[2007秋]选择题30 D [2006秋]选择题26 D [2006春]选择题28 D
[考试要求](二)初始化基类成员和对象成员的方法;★★ [主要知识点]
1、初始化基类成员
在派生类中构造函数头部必须调用基类的构造函数,初始化基类成员;当基类有缺省的构造函数时,可不在派生类的构造函数中列出,而自动调用缺省的构造函数。基类成员的初始化,是通过基类名调用基类的构造函数实现的。
2、初始化对象成员(某类的数据成员是另一个类的对象)
对象的初始化与基类成员的初始化相似,所不同的是通过对象调用所属类的构造函数实现的。
3、构造函数和析构函数的调用顺序
(1)构造函数的调用顺序:先基类,再对象所属的类,最后是派生类。若有多个基类,则先派生先调用,后派生后调用;若有多个对象类,对象先说明先调用,后说明后调用。 (2)析构函数的调用顺序通常与构造函数的调用顺序相反。 例:例写出下列程序的运行结果。 #include
class D:public A,public B{ // 派生的顺序 public: int d; C c1; A a1; D(int x,int y,int z,int m):B(x),A(y),a1(z),c1(m) // 构造函数调用顺序 {d=m; cout<<\调用了 D 的构造函数\\n\ ~D( ){cout<<\调用了 D 的析构函数 !!!\\n\ } ;
void main( ) { D d1(1,2,3,4); cout< 运行结果: 调用了 A 的构造函数 调用了 B 的构造函数 调用了 C 的构造函数 调用了 A 的构造函数 调用了 D 的构造函数 2 1 3 4 调用了 D 的析构函数 !!! 调用了 A 的析构函数 !!! 调用了 C 的析构函数 !!! 调用了 B 的析构函数 !!! 调用了 A 的析构函数 !!! [试题] [2006春]填空题5 (5)②③① [考试要求](三)支配规则和赋值兼容性;★★ [主要知识点] 1、支配规则:派生类中新增成员和从基类继承来的成员同名时,缺省使用的是派生类中的新增成员;若使用从基类继承来的成员,应在成员前加基类名和作用域运算符(基类名::成员名)。 2、赋值兼容性:把派生类中从基类继承来的成员赋给基类的对象,即基类对象=派生类对象。 [试题] [2007春]选择题26 C [2006秋]选择题28 B [考试要求](四)虚基类与抽象类的应用。★★ [主要知识点] 1、虚基类:对多继承的派生类,它将只保持一个基类的成员拷贝;其说明方法是在派生方式前或派生方式后加virtual。 2、虚基类构造函数的调用,是在派生类中直接调用的。 3、抽象类:指通常不能直接产生对象、只能用作基类来派生出新类的类,主要有两种: (1)构造函数或析构函数为非公有访问权限; (2)含纯虚函数(没有函数的实现部分)。 [试题] [2007秋]选择题25 C [2007秋]填空题2 (2)抽象类 [2007秋]填空题4 (5)虚基类 [考试要求]六、虚函数的概念,虚函数的应用。★★★ [主要知识点] 1、虚函数的概念 (1)当一个基类有一组派生类,基类中的某个成员函数需在每个派生类中完成类似的操作,则将该成员函数定义为虚函数。 (2)虚函数必须是类的一个成员函数,不能是友元函数和静态的成员函数。 (3)虚函数不能是构造函数,可以是析构函数。 (4)纯虚函数:被赋值0的虚函数,没有函数体。 [试题] [2007春]选择题29 D 2、虚函数的应用:实现动态多态性(运行多态性)。运算符重载是实现静态多态性(编译多态性)。 (1)当在基类中把成员函数定义为虚函数后,在其派生类中定义的虚函数必须与基类中的虚函数同名同参(参数的类型、个数相同); (2)动态的多态性是通过基类的指针变量分别指向基对象和派生类的对象实现的。如: #include class B:public A{ int y; public: B(int b=10){y=b;} void print(){cout<<\ void print(int a){cout< void main() { A a(15),*pa=&a; a.print(); a.show(); pa->print(); pa->show(); //A B b(20); b.print(); b.print(1);b.show(); b.show(2); //B b.A::show(); //C pa=&b; pa->print(); //D pa->show(); //E } 运行结果: A::x=15 x=15 A::x=15 x=15 B::x=5 y=20 26 A::x=5 y=20 B::x=5 y=20 x=5