C++ 类的构造函数使用规则

//类的构造函数使用规则
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class PointA{

};

class PointB{
public:
    PointB(int _a, int _b, const char *pin/*in*/){
        x = _a;
        y = _b;
        remark = (char *)malloc(sizeof(char)*(strlen(pin) + 1));
        strcpy(remark, pin);
        cout << "我是自定义的有参构造函数4" << endl;
    }
private:
    int x;
    int y;
    char *remark;
};

class PointC{
public:
    PointC(PointC &pm){
        cout << "我是自定义的拷贝构造函数3" << endl;
        //修改拷贝构造函数
        x = pm.x;
        y = pm.y;
        //remark = pm.remark; 这句话错误
        //修改后的方案
        remark = (char *)malloc(sizeof(char)*(strlen(pm.remark) + 1));
        strcpy(remark, pm.remark);
    }
private:
    int x;
    int y;
    char *remark;
};

void ProtectA(){
    PointA p1;//调用默认无参构造函数
    PointA p2=p1;//调用默认拷贝构造函数
    //结论①:当类中没有定义任何一个构造函数时,c++编译器会提供无参构造函数和拷贝构造函数

    //PointB p3; //报错: error C2512: “PointB”: 没有合适的默认构造函数可用
    PointB p4(3,3,"455");//调用自定义有参构造函数
    PointB p5 = p4;//调用默认拷贝构造函数
    //结论②:当类中定义了任意的非拷贝构造函数(无参,有参),c++编译器不会提供无参构造函数,
    //但是如果类中也没有定义任意的拷贝函数,那么c++编译器还是会提供默认拷贝构造函数
     
    //PointC p6; //报错   error C2512: “PointC”: 没有合适的默认构造函数可用
    //结论③:当类中定义了拷贝函数时,c++编译器不会提供默认的无参构造函数

    //结论④:默认拷贝构造函数只是类成员变量间的简单赋值(详情参考类的浅拷贝)
}

void main(){
    

    system("pause");
}

 

构造函数和析构函数调用顺序总结:

构造函数与析构函数的调用顺序

当类中有成员变量是其它类的对象时

首先调用成员变量的构造函数

调用顺序与声明顺序相同

之后调用自身类的构造函数

析构函数的调用顺序与对应的构造函数调用顺序相反

posted on 2016-06-22 17:36  寒魔影  阅读(529)  评论(0编辑  收藏  举报

导航