4【析构函数】17.析构函数和构造函数一样,也是类的一个公有成员函数,没有返回值类型说明,也不能被指定为void类型。和构造函数不同的是,析构函数不接收任何参数,但可以是虚函数。由于析构函数没有函数参数,因此它不能被重载。一个类只有一个析构函数。【构造函数】18.假定MyClass为一个类,则执行MyClassa,b(2),*p;语句时,自动调用该类的构造函数的次数为(A)。A.2B.3C.4D.5评:定义一个指向类对象的指针变量时,并不创建一个对象,因此,定义指向类对象的指针变量时,并不会调用构造函数(包括默认构造函数)进行初始化。本题如果改为MyClassa,b(2),*p=newMyClass;则结果为调用构造函数3次。【静态数据成员】19.静态数据成员的初始化与该类的构造函数无关,不能在构造函数中对它进行初始化。静态数据成员初始化:intClass::static_data_member=0;(已有如下定义:staticintstatic_data_member;),另外,初始化只能在类体外进行。补充:在类体中不允许对数据成员进行初始化。【常数据成员】20.只能通过成员初始化列表的方式来生成构造函数对该数据成员初始化。如下:Class(inti):x(i){}(Class为类名,已有如下定义:constintx;)。【常成员函数】21.只有常成员函数才有资格操作常对象。常对象只能调用常成员函数。【构造函数】22.当程序执行到对象定义时,调用自动局部对象的构造函数。该对象的析构函数在对象离开范围时调用(即离开定义对象的块时,这一点很重要,假如一个对象obj在外部函数中被定义,而该函数又在main函数中被调用,那么当函数被调用时,创建obj对象,当函数调用结束,返回main函数时,则该对象已离开其作用域,此时即被删除)。自动对象的构造函数与析构函数在每次对象进入和离开范围时调用。假设生成派生类对象,基类和派生类都包含其他类的对象,则在建立派生类的对象时,首先执行基类成员对象的构造函数,接着执行基类的构造函数,然后执行派生类的成员对象的构造函数,最后才执行派生类的构造函数。析构函数的调用次序与调用构造函数的次序相反。【构造函数,拷贝构造函数】*23.分析程序写结果:#include
usingnamespacestd;classB{public:B(){cout<<"defaultconstructoriscalled"<5BPlay(Bb){cout<<"functionPlay()nowisrunning"<
6别具有公有成员或私有成员的特性。(基类自身的成员可以访问基类中任何一个成员,但是通过基类的对象就只能访问其公有成员。)对于单个类来说,私有成员和保护成员没有什么区别。但对于继承来说,保护成员与私有成员则不同,保护成员可以被派生类的成员(注意,不是对象)访问,而私有成员不可以被派生类的成员访问。保护成员和公有成员又有所不同,保护成员即使在公有继承的情况下也不能被派生类的对象访问,而公有成员可以在公有继承的情况下,被派生类的对象访问。【多继承,二义性】26.基类和派生类中同时出现的同名函数,不存在二义性。因为如果不使用限定法,则派生类默认访问派生类函数。【虚基类】27.虚基类是这样一个类:它虽然被一个派生类间接地多次继承,但派生类却只继承一份该基类的成员,这样就避免了在派生类中访问这些成员时产生二义性。【虚基类,构造函数】*28.一般派生类不需要为间接基类提供构造函数的初始化值,它们只与直接基类打交道。对于非虚基类,在派生类的构造函数中初始化间接基类是不允许的,而对于虚基类,则必须在派生类中对虚基类初始化。如果在派生类的构造函数的成员初始化列表中没有列出对虚基类构造函数的调用,则表示使用该虚基类的默认构造函数。我们将建立对象时所指定的类称为最派生类。建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类的成员是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的,而且,只有最派生类的构造函数会调用虚基类的构造函数,该派生类的其他基类对虚基类构造函数的调用都被自动忽略,从而保证了虚基类的构造函数只被调用一次,从虚基类中继承来的数据成员只被初始化一次。当在一个成员初始化列表中同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非虚基类的构造函数执行。例子程序:#include
usingnamespacestd;classBase{public:Base(chari){cout<<"Baseconstructor.--"<7};classMyDerived:publicDerived1,publicDerived2{public:MyDerived(chari,charj,chark,charl,charm,charn,charx):Derived2(i,j),Derived1(k,l),Base(m),d(n){cout<<"MyDerivedconstructor.--"<usingnamespacestd;classA{public:intn;};classB:publicA{};//classB:virtualpublicA{};classC:publicA{};//classC:virtualpublicA{};classD:publicB,publicC{public:intgetn(){returnB::n;}};intmain()
8{Dd;d.B::n=10;d.C::n=20;cout<