目录
一、浅拷贝:浅拷贝就是对象的数据成员之间的简单赋值
二、深拷贝:源对象与拷贝对象互相独立
三、总结:
1、什么时候必须定义自己的拷贝构造函数呢?
2、出现段错误的原因:
3、浅拷贝和深拷贝的写法
注意浅拷贝的构造函数
深拷贝的构造函数
一、浅拷贝:浅拷贝就是对象的数据成员之间的简单赋值
形象举例:浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。
#include<iostream>
#include<string>
using namespace std;class Student
{
public:/*****************构造函数*********************/Student( string _name, int _age, int _id){string name = _name;int age = _age;int id = _id;cout << name << "今年" << age << "岁了,他的学号是" << id << ",他正在学习" << endl;}/*****************析构函数*********************/~Student(){cout << "析构函数" << endl;}/*****************浅拷贝函数*********************///浅拷贝函数默认是有的,如果想要打印出来浅拷贝,就必须写出来,否则不会打印到终端Student(const Student &s1) {cout << "浅拷贝构造"<<endl;}private:string name[3];int age;int id;
};int main()
{//实例化s1Student s1("jhu", 18, 608);//实例化s2,将s1赋值给s2Student s2(s1);return 0;
}
由上面的式子可知:
- 浅拷贝和构造函数互为重载;
- 浅拷贝默认存在。如果需要打印出拷贝的值,就必须把浅拷贝函数写出来
二、深拷贝:源对象与拷贝对象互相独立
形象举例:一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人
#include<iostream>
using namespace std;class Demo
{
public:
/****************构造函数****************/Demo(int _num = 0){num = _num;if (0 == num){p = NULL;}else if (num > 0){p = new int[num]();//申请空间,并且都清0}cout << "构造函数" << endl;}
/****************拷贝构造函数--深拷贝****************/Demo(const Demo &demo){this->num = demo.num;this->p = new int[this->num]();//申请空间memcpy(this->p, demo.p, sizeof(int) * num);cout << "拷贝构造函数" << endl;}
/****************输入函数****************/ void input(){if (0 == num){cout << "无值" << endl;}else{int i;for (i = 0; i < num; i++){cin >> p[i];}cout << endl;}}
/****************显示到终端****************/void show(){if (0 == num){cout << "无值" << endl;}else{int i;for (i = 0; i < num; i++){cout << p[i] << "";}cout << endl;}}
/****************析构函数****************/~Demo(){cout << "析构开始" << endl;if (p != NULL){delete[]p;p = NULL;}cout << "析构结束" << endl;}
private:int num;int* p;
};int main()
{Demo demo1(3);demo1.show();demo1.input();demo1.show();cout << "******************************" << endl;Demo demo2 = demo1;//等价于Demo demo2(demo1)demo2.show();return 0;
}
三、总结:
1、什么时候必须定义自己的拷贝构造函数呢?
当系统提供的不能满足我们的要求,在空间开辟时就需要用new来开辟
2、出现段错误的原因:
- 操作NULL;
- 野指针;
- 数组越界;
- free了又free
3、浅拷贝和深拷贝的写法
注意浅拷贝的构造函数
Student(const Student &s1)
{
cout << "浅拷贝构造"<<endl;
}
深拷贝的构造函数
Demo(const Demo &demo)
{
this->num = demo.num;
this->p = new int[this->num]();//申请空间
memcpy(this->p, demo.p, sizeof(int) * num);
cout << "拷贝构造函数" << endl;
}