构造函数的目的在于初始化数据,并不鼓励调用默认构造函数(默认拷贝构造函数是浅拷贝,会有野指,且不是所有情况都会调用默认构造函数)
自己编写的构造函数大概分为
1、无参构造函数
2、有参构造函数
3、拷贝构造函数(复制构造函数)
还有一个
a、赋值函数(这个不算构造函数,容易与拷贝构造函数混淆)
#ifndef AREA_H #define AREA_H #include<iostream> using 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" #include <iostream> using 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" #include<iostream> using 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<n_count;i++) { n_ptr[i] = temp.n_ptr[i]; } cout << "调用深拷贝构造函数" << endl; }