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");
}

 

posted on 2016-06-21 17:46  寒魔影  阅读(195)  评论(0编辑  收藏  举报

导航