C++(二十七) — 深拷贝、浅拷贝、复制构造函数举例
阅读原文时间:2023年07月12日阅读:1

1、复制构造函数、及new空间申请

复制构造函数,也是构造函数。只在初始化时调用,如果定义对象后赋值,比如,t1=t2,则只是运算符重载,没有调用构造函数。

注意:

(1)复制构造函数是函数的形参是类的对象的引用的构造函数;

(2)用一个已经存在的对象,初始化一个新的同类对象;

(3)系统会自动生成一个默认复制构造函数,将成员一一复制;

(4)类的数据成员包含指针变量,构造函数用 new 为其申请空间,必须在复制构造函数中为新对象申请新的堆空间

#include ;
#include
using namespace std;

class student
{
public:
student(int,char*, int, float);
student(student&);
~student();
void printstu();
private:
int id, age;
char* name;
float score;
};
// 构造函数
student::student(int i, char *c, int a, float s)
{
cout << "Constructing…." << endl;
id = i; age = a;
score = s;
name = new char[strlen(c) + ];
if (name != )
strcpy_s(name, strlen(c) + , c);
}
// 复制构造函数
student::student(student& s)
{
cout << "Copy Constructing…." << endl;
id = s.id; age = s.age;
score = s.score;
name = new char[strlen(s.name) + ];
if (name != )
strcpy_s(name, strlen(s.name) + , s.name);
}
// 析构函数
student::~student()
{
cout << "Destructing…" << endl;
delete []name; // 释放申请的内存空间
name = ;
}
void student::printstu()
{
cout << "学号:" << id << " 姓名:" << name << endl;
cout << "年龄:" << age << " 成绩:" << score << endl;
}

void main()
{
student s1(, "wang", , );
s1.printstu();
student s2(s1);// 调用复制构造函数

system("pause");  
return;  

}

2、浅拷贝、深拷贝

  指对于类或结构体这类复合类型的变量。当类的成员变量中含有指针或引用时,在赋值或初始化过程中,若只修改指针指向,没有开辟新的空间,则是浅拷贝;(因为所指内容空间只有一份,若其中一个变量销毁时,空间释放,则另一个变量就出现指针悬挂问题)。

  深拷贝:开辟另一个内存空间(在堆内存中),将内容复制过去。这样就存在两个内存空间,保存相同内容。

  C++中默认的等号操作符也是浅拷贝,只是把指针的内存地址拷贝了,但没有开辟对应的内存空间。