C++ 构造函数与析构函数
//构造函数--析构函数 #include<iostream> using namespace std; class Point{ public: /*无参构造函数*/ Point(){ x = 0; y = 1; cout << "无参构造函数被执行了.." << endl; } /*有参构造函数*/ Point(int _x, int _y = 3){ x = _x; y = _y; cout << "有参构造函数被执行了.." << "x=" << x << "y=" << y << endl; } /*拷贝构造函数*/ Point(Point &pm){ x = pm.x; y = pm.y; cout << "拷贝构造函数被执行了.." << "x=" << x << "y=" << y << endl; } ~Point(){ cout << "析构函数被执行了.." << "x=" << x << "y=" << y << endl; } private: int x; int y; }; //有参构造函数用法 void Ptest(){ Point pt1; //在类定义的时候,如果没有手动调用构造函数,c++编译器会自动调用类的无参构造函数来初始化类 //在调用无参构造函数的时候,c++编译器会优先调用程序员所写的无参构造函数,如果没有自定义的构造函数, //c++编译器会生成默认的无参构造函数 //有参构造函数的三种调用方式‘ //方式一 Point pt2(0, 0); //方式二 Point pt3 = Point(1, 1); //方式三 Point pt4 = (2, 2); } void Ptest3(Point pm){ ; } Point Ptest4(){ Point pt; return pt; } //拷贝构造函数用法 void Ptest2(){ Point pt1; //方式一 Point pt2 = pt1; Point pt3;//此处调用无参构造函数 //注意:pt3 = pt1;此时没用调用拷贝构造函数,只是类的赋值 pt3 = pt1; //方式二 Point pt4(pt3); //方式三 Point pt5; Ptest3(pt5); //在调用函数Ptest3(),这里的实参是point类对象,形参也是一个point类对象,这时候c++编译器会执行拷贝函数 //方式四 Point pt6; pt6 = Ptest4(); //说明:Point pt6;调用了无参构造函数 //进入函数Ptest4();①:执行Point pt;生成一个临时类对象 pt,调用无参构造函数, //②:执行return pt;c++编译器会生成一个Point的临时对象(跟return 1;不一样,return 1没有生成临时变量存储1) //此时会调用拷贝构造函数,初始化这个临时对象,并且析构pt这个对象;③:pt6 = Ptest4();完成对象间的赋值操作 //执行完成Ptest2()函数 执行pt6的析构函数 //特殊案例 Point pt7 = Ptest4(); //通过观察发现 pt7不会调用任何构造函数,这是因为c++编译器把返回的这个临时对象直接转化成pt7了 //结论:如果返回的匿名对象,来初始化另一个同类型的类对象,那么匿名对象会直接转成新的对象 //但是pt6本质上是一个赋值操作,并非初始化 } void main(){ Ptest2(); system("pause"); }