拷贝构造函数
今天的拷贝构造函数讲解了三种拷贝构造函数的使用形式,以及两种拷贝类型。两种拷贝类型分别是浅拷贝和深拷贝。三种拷贝的使用形式分别是
显示拷贝构造
主调函数传给被调函数形参
函数返回值是对象也调用拷贝构造函数
显示拷贝构造
对于显示拷贝构造,举一个最简单的例子即可
主调函数传给被调函数形参
具体的内容见下面的程序以及注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> using namespace std; class CSstudent { private: int Ild; char *sName; int nAge; public:
CSstudent(int Ild = 0, const char* name="NULL", int age = 0) {
this->Ild = Ild; nAge = age; if (name) { int nLen = (strlen(name)) + 1; sName = new char[nLen]; strcpy_s(sName, nLen, name); } else { sName = new char[7]; strcpy_s(sName, 7, "未命名"); } } CSstudent(const CSstudent& stu) { this->Ild = stu.Ild; this->nAge = stu.nAge; int nLen = strlen(stu.sName) + 1; this->sName = new char[nLen]; strcpy_s(this->sName, nLen, stu.sName); cout << "拷贝构造" << sName << endl; } ~CSstudent() { cout << sName <<" "<< "析构" << endl; delete[] sName; } void display() { cout << Ild << "\t" << sName << "\t" << nAge << endl; }
}; int main(void) { CSstudent stu1(2021114062, "张三", 18); stu1.display(); CSstudent stu[2]; for (int i = 0; i < 2; i++) { stu[i].display(); cout << endl; } CSstudent* pStu = NULL; pStu = new CSstudent(20230999, "李四",19);
CSstudent stu3(*pStu);
pStu->display(); delete pStu;
CSstudent stu2 = stu1; stu2.display();
return 0; }
|
函数返回值是对象也调用拷贝构造
见如下例子,该例子十分重要,仔细看一下
1 2 3 4
| CSstudent test(CSstudent stu){ return stu; }
|
先拷贝与深拷贝
在这里给出定义:
浅拷贝
拷贝构造函数:当没编写拷贝构造,则使用默认的拷贝构造,此时属于【浅拷贝】
深拷贝
深拷贝涉及到新开辟一块地址空间