新建C++的类,编译器会加入以下默认的成员函数:
·默认构造函数和拷贝构造函数
·析构函数
·赋值函数(赋值运算符)
1.构造函数
作用:用来对类的数据成员进行初始化和分配内存。
2.拷贝构造函数
C++独有的,是一种特殊的构造函数,用与对该类的对象构造和初始化,即初始化该对象的一块内存区域;
系统默认的拷贝构造函数是浅拷贝,如果需要深拷贝,则需要自己定义拷贝构造函数。如果用户定义了拷贝构造函数,编译器就不再生成拷贝构造函数。
浅拷贝最担心的问题是指针的拷贝,只拷贝了指针的地址,指向的空间内容并没有复制,而是由两个对象共用。
使用拷贝构造函数的时机:
1)一个对象以值传递的方式传入函数体;
2)一个对象以值传递的方式从函数返回;
3)一个对象需要通过另一个对象进行初始化;
CData d1;
CData d2(d1);//拷贝构造函数,d2对象是不存在的,是用d1对象来构造和初始化的
CData d3 = d1;//拷贝构造函数,d3对象是不存在的,是用d1对象来构造和初始化的
//拷贝构造函数重载声明如下:
A (const A&other)
3.赋值函数
用与一个类的对象向该类的另一个对象赋值,是对于一个已经被初始化过的对象来进行赋值操作。
在赋值时,如果原来的对象中有内存分配要先把内存释放掉,还要检察一下两个对象是不是同一个对象,如果是,不做任何操作,直接返回。
CData d1;
CData d2;
CData d2 = d1;//赋值构造函数
赋值运算的重载声明如下:
A& operator = (const A& other)
4、禁用拷贝与赋值
如果不想写拷贝构造函数和赋值函数,又不允许使用编译器生成的缺省函数,处理办法如下:
class CData
{
CData();
//C++11
CData(const CData& _modebus) = delete;
CData& operator = (const CData&) = delete;
~CData();
};
class CData
{
CData();
~CData();
private:
CData(const CData& _modebus);
CData& operator = (const CData&);
};