邵阳网站制作建设,wordpress 4.9摘要,网站名重复,中国电子商务平台有哪些目录 一、浅拷贝#xff1a;浅拷贝就是对象的数据成员之间的简单赋值
二、深拷贝#xff1a;源对象与拷贝对象互相独立
三、总结#xff1a;
1、什么时候必须定义自己的拷贝构造函数呢#xff1f;
2、出现段错误的原因#xff1a;
3、浅拷贝和深拷贝的写法 注意浅拷贝…目录 一、浅拷贝浅拷贝就是对象的数据成员之间的简单赋值
二、深拷贝源对象与拷贝对象互相独立
三、总结
1、什么时候必须定义自己的拷贝构造函数呢
2、出现段错误的原因
3、浅拷贝和深拷贝的写法 注意浅拷贝的构造函数
深拷贝的构造函数 一、浅拷贝浅拷贝就是对象的数据成员之间的简单赋值
形象举例浅拷贝是指源对象与拷贝对象共用一份实体仅仅是引用的变量不同名称不同。对其中任何一个对象的改动都会影响另外一个对象。举个例子一个人一开始叫张三后来改名叫李四了可是还是同一个人不管是张三缺胳膊少腿还是李四缺胳膊少腿都是这个人倒霉。
#includeiostream
#includestring
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;
} 由上面的式子可知
浅拷贝和构造函数互为重载浅拷贝默认存在。如果需要打印出拷贝的值就必须把浅拷贝函数写出来
二、深拷贝源对象与拷贝对象互相独立
形象举例一个人名叫张三后来用他克隆假设法律允许了另外一个人叫李四不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人
#includeiostream
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; }