构造函数,就是用来初始化变量的,它是用系统自动调用的,要是没有写构造函数的话,系统会为之生成一个默认的构造函数,它的调用就是在声明变量的时候系统就自动地隐式调用。
C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用。然而给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象.
实质上,如果不在类中显式的定义拷贝构造函数,类也会定义一个默认的拷贝构造函数,完成所有成员的逐个复制。
说到这,介绍一个很重要的概念--默认构造函数。默认构造函数与默认拷贝构造函数不同,默认构造函数无参,若用户没有编写构造函数,编译器会产生一个默认构造函数,这个构造函数什么也不做,若定义了构造函数,则不会产生默认构造函数。注意默认构造函数与默认拷贝构造函数不同,两个虽然都是在没有定义构造函数的情况下产生,但是两个是完全不同的函数,默认构造函数是无参函数,并且什么都不做,只是一个空头衔。但是默认拷贝构造函数需要传参,形参是类对象,且需要完成所有成员的逐个复制。
析构函数:类名作为函数名,在前面加上~。析构函数不允许重载,并且析构函数无参
通常情况下对象在程序结束的时候会自动调用析构函数,但是需要注意的是动态分配内存的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include<iostream> using namespace std; unsigned time=0; class ABC{ int data; string name; public: ABC(int d,const char *ch):data(d),name(ch) { time++; cout<<time<<"调用构造"<<endl; } ABC(ABC &a) { time++; data=a.data; name=a.name; cout<<time<<"Copy 构造"<<endl; } ~ABC(){time++; cout<<time<<"析构函数"<<endl;} }; ABC func(ABC a) { return a; } int main() { ABC b(13,"XUYI"); ABC a(12,"WHAT"); b=func(a); cout<<"--------pause--------"<<endl; return 0; } |
这里在调用函数func时,传入参数为ABC a的形式,其实这个时候编译器会创建一个对象a的拷贝对象。也就是调用了一次拷贝构造函数,再返回的时候,又创建了一个返回对象的拷贝对象,所以又调用了一次拷贝构造函数。所以在那个函数结束的时候会调用两次析构函数。