构造函数的目的在于初始化数据,并不鼓励调用默认构造函数(默认拷贝构造函数是浅拷贝,会有野指,且不是所有情况都会调用默认构造函数)
自己编写的构造函数大概分为
1、无参构造函数
2、有参构造函数
3、拷贝构造函数(复制构造函数)
还有一个
a、赋值函数(这个不算构造函数,容易与拷贝构造函数混淆)
#ifndef AREA_H#define AREA_H#includeusing namespace std;//大项目不鼓励这么写,不然命名空间将失去作用,造成变量冲突class Area{public: Area(); //无参构造函数 Area(int len,int wid); //有参构造函数 Area(const Area &temp); //拷贝构造函数(复制构造函数) ~Area(); Area &operator= (const Area &other); //赋值函数 这个不是构造函数(有返回值)private: int length; int width;};#endif
#include "Area.h"#includeusing namespace std;Area::Area(){ length = 0; width = 0; cout << "调用无参构造函数" << endl;}Area::Area(int len,int wid){ length = len; width = wid; cout << "调用有参构造函数" << endl;}Area::Area(const Area &temp){ length = temp.length; width = temp.width; cout << "调用拷贝构造函数" << endl;}Area::~Area(){ cout << "调用析构函数" << endl;}Area& Area::operator= (const Area &other)//注意到这个是有返回值的{ length = other.length; width = other.width; cout << "调用赋值函数" << endl; return *this;}
#include "Area.h"#includeusing namespace std;int main(){ Area a; //调用无参构造函数 Area b(2,3);//调用有参构造函数 Area c(b); //调用拷贝构造函数,复制初始化 Area d=b; //调用拷贝构造函数,赋值初始化 a = b; //调用赋值函数 return 0;}
下面为运行结果
下面讲一下深拷贝与浅拷贝:
浅拷贝(位拷贝):只考虑所有成员的值(如果堆分配空间,指针指向这个堆空间,那么浅拷贝就是简单赋值,俩个指针指向一块内存,一个释放,另外一个就是野指了)
深拷贝(值拷贝):复制引用对象本身(如果堆分配空间,指针指向这个堆空间,那么深拷贝会分配新的空间给新对象的指针变量)
举例说明:
class Area{public: Area(); //无参构造函数 Area(int len,int wid); //有参构造函数 Area(const Area &temp); //拷贝构造函数(复制构造函数) ~Area(); Area &operator= (const Area &other); //赋值函数 这个不是构造函数(有返回值)private: int length; int width; int n_count; int *n_ptr;};
Area::Area(const Area &temp){ n_count = temp.n_count; n_ptr = temp.n_ptr; cout << "调用浅拷贝构造函数" << endl;}
Area::Area(const Area &temp){ n_count = temp.n_count; n_ptr = new int[n_count]; for(int i=0;i