构造函数与析构函数

来源:互联网 发布:肖斯塔科维奇知乎 编辑:程序博客网 时间:2024/05/01 18:15

一、构造函数

1.基类的构造函数不被继承,需要在派生类中自行声明。声明构造函数时,只需要对本类中新增加的成员进行初始化,对继承来的成员的初始化由基类完成。

2.(1)单继承时的构造函数
  派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数){
                         本类成员初始化;
}
(2)多继承时的构造函数
派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名1(参数),基类名2(参数),基类名3(参数){
                         本类成员初始化;
}
(3)多继承且有内嵌对象时的构造函数
派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名1(参数),基类名2(参数),基类名3(参数),对象数据成员的初始化{
                         本类成员初始化;
}

当基类中声明有缺省形式的构造函数或末声明构造函数时,派生类构造函数的声明中也可以省略对基类构造函数的调用;若基类中末声明构造函数,则派生类中也可以不声明,全采用缺缺省形式构造函数;当基类声明有带形式参数的构造函数时,派生类也月应声明带形参构造函数,提供将参数传递给基类构造函数的途径。

3.构造函数的调用顺序
(1)调用基类的构造函数,调用顺序按照它们被继承时声明的顺序(从左到右)。
(2)调用成员对象的构造函数,调用顺序按照它们在类中声明的顺序。
(3)派生类的构造函数中的内容。
//main.cpp=====================================
//带有内嵌对象的多继承构造函数调用顺序测试============
#include<iostream>
using namespace std;
//类的定义及实现=====================================
class B1 {
public:
 B1(int i){

cout<<"constructing B1   "<<i<<endl;}
};
class B2 {
public:
 B2(int i){

cout<<"constructing B2   "<<i<<endl;}
};
class B3 {
public:
 B3(){

cout<<"constructing B3  *"<<endl;

}
};
class C:public B2,public B1,public B3{

public:
 C(int a,int b,int c,int d):
   B1(a),memberB2(d),memberB1(c),B2(b){

}
private:
 B1 memberB1;
 B2 memberB2;
 B3 memberB3;
};
//主函数========================================
int main(){
C object(1,2,3,4);
return 0;
}
//输出结果
constructing B2 2
constructing B1 1
constructing B3 *
constructing B1 3
constructing B2 4
constructing B3 *

4.拷贝构造函数(若没有声明,系统自动生成一个)在以下三种情况被调用:假定Time为一个时间类
(1)当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现拷贝赋值。
      void main(){

Time A(1,2),B;

B=A;

}
(2)若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。
      void fun(Time p){}
     void main(){

                  Time A(1,2);

                       fun(A);

}
(3)当函数的返回值是类的对象时,系统自动调用拷贝构造函数。
    point fun(){

               Time A(1,2);

                    return A;

}
    void main(){

                     Time B;

                         B=fun();

}
5.类的组合:类中的成员是另一个类的对象。
其构造函数的设计原则:不仅要对本类中的基本类型成员数据赋初值,也要对对象成员初始化。
声明形式:    类名::类名(对象成员所需要的形参,本类成员形参):对象1(参数),对象2(参数),...
               {本类初始化}
构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的

构造函数。(析构函数的调用顺序相反)。若调用缺省的构造函数(即无形参的),则内嵌对象的初始化也将调

用相应的缺省构造函数。

二、析构函数

1.继承时的析构函数
   析构函数也不被继承,派生类自行声明。声明方法与一般类的析构函数相同。不需要显示地调用基类的析构函数,系统将会自动隐式调用。析构函数的调用顺序与构造函数相反。在有动态分配堆上内存的时候,析构函数必须是虚函数(保证派生类的对象也被销毁,如果不是这样,在基类析构时,派生类的对象不会被销毁),但没有必要是纯虚函数。