浅拷贝
浅拷贝指的是仅拷贝对象的所有成员,包括指针的值,而不包括其引用对象(例如指针指向的其他内容)。
看下面这个例子:
#pragma once
#include <string>
//学生
class Student {
public:
Student(std::string name, int age);
~Student();
void printInfo();
private:
std::string _name;
int _age;
};
#include "Student.h"
#include <stdio.h>
Student::Student(std::string name, int age) {
_name = name;
_age = age;
}
Student::~Student() {
_name = "";
_age = -1;
}
void Student::printInfo() {
printf("Name:%s Age:%d\n", _name.c_str(), _age);
}
#pragma once
#include <string>
//教室
class Student;
class Classroom {
public:
Classroom(int grade);
~Classroom();
void addStudent(std::string name, int age);
void printInfo();
private:
int _grade;//年级
Student* _student = nullptr;
};
#include "Classroom.h"
#include "Student.h"
Classroom::Classroom(int grade) {
_grade = grade;
}
Classroom::~Classroom() {
_grade = 0;
delete _student;
_student = nullptr;
}
void Classroom::addStudent(std::string name, int age) {
_student = new Student(name, age);
}
void Classroom::printInfo() {
printf("Grade:%d ", _grade);
if (_student == nullptr){
printf("No Student\n");
} else {
_student->printInfo();
}
}
#include <QtCore/QCoreApplication>
#include "Classroom.h"
#include "Student.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//1.创建一个教室并且添加一个学生
Classroom* room1 = new Classroom(6);
room1->addStudent("张三", 16);
room1->printInfo();
//2.把教室1的内容复制给教室2 - 浅拷贝
Classroom room2 = *room1;
room2.printInfo();
//3.删除教室1
delete room1;
room1 = nullptr;
//4.重新打印教室2
room2.printInfo();
return a.exec();
}
运行结果:
虽然room1把值对象的值付给了room2,赋值的只是room中的成员变量,并没有把_student拷贝一份,而只是把指针地址赋值给了room2,但是当room1销毁后,room2除了_grade的值以外,指针执行的内存同时也销毁了。
深拷贝
深拷贝除了拷贝其成员本身的值之外,还拷贝的成员指向的动态内存等的内容。
修改一下Classroom的复制构造函数
#pragma once
#include <string>
//教室
class Student;
class Classroom {
public:
Classroom(int grade);
Classroom(Classroom&room);
~Classroom();
void addStudent(std::string name, int age);
void printInfo();
private:
int _grade;//年级
Student* _student = nullptr;
};
#include "Classroom.h"
#include "Student.h"
Classroom::Classroom(int grade) {
_grade = grade;
}
Classroom::Classroom(Classroom&room) {
this->_grade = room._grade;
this->_student = new Student(room._student->getName(), room._student->getAge());
}
Classroom::~Classroom() {
_grade = 0;
delete _student;
_student = nullptr;
}
void Classroom::addStudent(std::string name, int age) {
_student = new Student(name, age);
}
void Classroom::printInfo() {
printf("Grade:%d ", _grade);
if (_student == nullptr){
printf("No Student\n");
} else {
_student->printInfo();
}
}
#pragma once
#include <string>
//学生
class Student {
public:
Student(std::string name, int age);
~Student();
std::string getName() {
return _name;
}
int getAge() {
return _age;
}
void printInfo();
private:
std::string _name;
int _age;
};
#include "Student.h"
#include <stdio.h>
Student::Student(std::string name, int age) {
_name = name;
_age = age;
}
Student::~Student() {
_name = "";
_age = -1;
}
void Student::printInfo() {
printf("Name:%s Age:%d\n", _name.c_str(), _age);
}
main函数不变,运行结果:
默认的拷贝行为基本都是浅拷贝,即仅仅拷贝其成员值。当然如果所有成员值没有引用任何外部对象,或者引用的外部对象定义了自己的深拷贝行为,那么深拷贝和浅拷贝是一样的。如果需要拷贝值以外的内容,如指针指向的内存等,需要自己编写复制构造函数。
aaa