//构造函数--析构函数
#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");
}