对象的初始化和清理:系统会自动进行

构造函数初始化:

创建对象的时候,函数自动调用

类名 (){} 没有void,可以有参数,可发生重载,程序自动调用一次

析构函数清理:对象销毁前自动调用一次
~类名 (){}没有void,不可以有参数,无法重载,程序自动调用一次

typedef class person{public:person(){cout << "构造函数" << endl;}~person(){cout << "重载函数" << endl;}};int main(){person p1;return 0;}

构造函数的分类及调用:

按参数分:有参构造和无参构造

按类型分:普通构造和拷贝构造

typedef class person{public://普通构造函数:person()//无参构造函数(默认){cout << "无参构造函数" << endl;}person(int a)//有参构造函数{age = a;cout << "有参构造函数" << endl;}拷贝构造函数person(const person& p)//拷贝传入人的所有属性{age = p.age;cout << "拷贝构造函数" << endl;}~person(){cout << "重载函数" << endl;}int age;};

三种调用方法:括号法,显示法,隐式转换法

int main(){//1.括号法:person p1;//默认构造函数调用时不要加()person p2(2);//有参函数调用person p3(p2);//拷贝构造函数调用cout << "p2 age:" << p2.age << endl;cout << "p3 age:" << p3.age << endl;//2.显示法person p1;//默认构造person p2 = person(2);//有参构造person p3 = person(p2);//拷贝构造person(2);//匿名对象,上面的p2相当于名字 当前行执行完,系统立即回收cout << 7545 << endl;//不要利用拷贝构造函数初始化匿名对象编译器会认为person(p3)===personp3//person(p3);//3.隐式转换person p4 = 10;//相当于personp4=person(10)person p5 = p4;//拷贝构造return 0;}

拷贝函数调用时机

//拷贝构造函数调用时机:1.使用创建过的变量初始化新的对象;//2.值传递的方式给函数传值,3.以值方式返回局部对象typedef class person{public://普通构造函数:person()//无参构造函数(默认){cout << "无参构造函数" << endl;}person(int a)//有参构造函数{age = a;cout << "有参构造函数" << endl;}//拷贝构造函数person(const person& p)//拷贝传入函数的所有属性{age = p.age;//编译器会自己执行cout << "拷贝构造函数" << endl;}~person(){cout << "重载函数" << endl;}int age;}person;//1.使用创建过的变量初始化新的对象:void test01(){person p1(20);person p2(p1);cout << "p2的年龄为:" << p2.age << endl;}//2.值传递的方式给函数传值voiddowork(person i){}void test02(){person p;dowork(p);//相当于person(i)=p.隐式调用构造函数}//3.以值方式返回局部对象:person dowork2(){person p1;cout << (int)&p1 << endl;return p1;}void test03(){person p=dowork2();//p1返回时创建相同临时变量temp相当于 personp=person(temp)cout << (int)&p << endl;}int main(){//test01();//test02();//相当于person(i)=p,隐式构造函数test03();return 0;}