C++构造函数初始化顺序详解
1.构造函数、析构函数与拷贝构造函数介绍
构造函数
1.构造函数不能有返回值
2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空
3.创建一个对象时,系统自动调用构造函数
析构函数
1.析构函数没有参数,也没有返回值。不能重载,也就是说,一个类中只可能定义一个析构函数
2.如果一个类中没有定义析构函数,系统也会自动生成一个默认的析构函数,为空函数,什么都不做
3.调用条件:1.在函数体内定义的对象,当函数执行结束时,该对象所在类的析构函数会被自动调用;2.用new运算符动态构建的对象,在使用delete运算符释放它时。
拷贝构造函数
拷贝构造函数实际上也是构造函数,具有一般构造函数的所有特性,其名字也与所属类名相同。拷贝构造函数中只有一个参数,这个参数是对某个同类对象的引用。它在三种情况下被调用:
1.用类的一个已知的对象去初始化该类的另一个对象时;
2.函数的形参是类的对象,调用函数进行形参和实参的结合时;
3.函数的返回值是类的对象,函数执行完返回调用者。
【代码】
/* version:1.0 author:hellogiser date:2014/9/25 */
#include"stdafx.h" #include<iostream> usingnamespacestd;
classpoint { private: intx,y; public: point(intxx=0,intyy=0) { x=xx; y=yy; cout<<"Constructor"<<endl; } point(constpoint&p) { x=p.x; y=p.y; cout<<"CopyConstructor"<<endl; } ~point() { cout<<"Destructor"<<endl; } intget_x() { returnx; } intget_y() { returny; } };
voidf(pointp) { //copyconstructor cout<<p.get_x()<<" "<<p.get_y()<<endl; //destructor }
pointg() { pointa(7,33);//constructor returna;//copyconstructor tempobject }
voidtest() { pointa(15,22);//constructor pointb(a);//(1)copyconstructor cout<<b.get_x()<<" "<<b.get_y()<<endl;//1522 f(b);// (2)copyconstructor b=g();//(3)copyconstructor cout<<b.get_x()<<" "<<b.get_y()<<endl;//7 33 }
intmain() { test(); return0; } /* Constructor CopyConstructor 15 22 CopyConstructor 15 22 Destructor Constructor CopyConstructor Destructor Destructor 7 33 Destructor Destructor */