VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 6150|回复: 110

《实用C++》第36课 对象的赋值与复制及拷贝构造函数

  [复制链接]
51_avatar_middle
最佳答案
8 
online_admins 发表于 2018-4-26 01:04:23 | 显示全部楼层 |阅读模式
1、对象的赋值:
何为对象的赋值?我们先来说说赋值,赋值咱们之前也给大家讲解过。说到赋值咱们肯定能想到=等号,一般赋值指的都是用=等号赋值,例如:
  1. int a = 5; //赋值操作
  2. int b = a; //这也是赋值
复制代码


那么对象也是一样的,也是用=等号,不过赋值的目标不是int类型的整型数了,而是用一个对象给同类的另外一个对象赋值。这个过程是通过成员复制来完成的,即,将一个对象的成员的值一个一个的复制给另外一个对象的对应成员。

2、对象的赋值举例:
有一个矩形的类,CMyRect 的声明如下:
  1. class CMyRect
  2. {
  3. public:
  4.     CMyRect(int w = 0, int h = 0):width(w), height(h){};
  5. public:
  6.     int width; //矩形的宽
  7.     int height; //矩形的高
  8. };
复制代码


接下来,我用这个矩形类定义两个对象:
  1. CMyRect rect_a(200, 100), rect_b;
复制代码

之后,我用 rect_a 给 rect_b 赋值,如下:
  1. rect_b = rect_a;
复制代码


之后,我们看看 rect_b 的宽和高都是多少呢?咱们来调试一下,看看具体的值。调试过程见视频教程的详细讲解!

3、对象赋值的注意事项:
①、对象的赋值,只是对对象的成员变量的赋值,对于成员函数来说不理会,也不做赋值处理,因为本身每个类的成员函数就一份而已所以也不需要赋值。这个之前给大家讲解this指针的时候提过,如果大家忘记了,可以看看以前的课程说明文档,在这里:《实用C++》第32课 this指针:https://www.cctry.com/thread-289911-1-1.html
②、类似上面的矩形类 CMyRect 的对象是可以直接用=等号赋值的,但是有一些成员是没办法用=等号赋值的,例如,成员变量是其他一种类对象,那么此时的解决办法就是重载类的=等号运算符,这个以后会给大家讲解;
③、还有一种情况下,使用对象的赋值也是非常危险的,例如咱们上节课最后给大家使用的那个 CStudent 类型,咱们来试试:
对象的赋值代码如下:
  1. void test()
  2. {
  3.     CStudent stud_1("zhangsan", 'f', 1001, 20);
  4.     CStudent stud_2;
  5.     stud_2 = stud_1;
  6. }

  7. int main(int argc, char* argv[])
  8. {
  9.     test();
  10.     return 0;
  11. }
复制代码


执行之后,程序崩溃了,如下图:
《实用C++》第36课 对象的赋值与复制及拷贝构造函数
大家想想为什么呢?为什么会崩溃,原因见视频教程讲解!

4、对象的复制:
刚才给大家说了对象的赋值,是利用=等号运算符将一个对象的成员变量赋值给另外一个同类对象的成员变量。可以说是对已经存在的两个对象进行操作。那么对象的复制呢?对象的复制是一个对象从无到有的一个过程,在对象创建的时候就以一个已经存在的对象为源头进行创建本对象。

例如:
  1. Student zhangsan = {"zhangsan", 1002, 20};
  2. Student lisi(zhangsan);
  3. Student wangwu = lisi;
复制代码


对于对象 lisi 和 wangwu 来说都是在创建的时候以 zhangsan 这个对象为源对象进行创建的,所以这里面就是用到了对象的复制操作。
这里面咱们来调试下上面的代码,看看具体的信息是否复制过去了。详细调试过程见视频教程!

5、复制/拷贝构造函数:
上面的代码中这句话:Student lisi(zhangsan); 大家看着是不是有点眼熟,我们在给大家讲解构造函数的时候就用到过类似的写法,具体在:
《实用C++》第33课 类的构造函数:https://www.cctry.com/thread-289921-1-1.html
我们过去看一眼!

所以,按理说 Student lisi(zhangsan); 这句代码也应该调用的是构造函数,对不对?没错,确实是,只不过这个构造函数有点特殊,名为拷贝构造函数。
原型如下:
  1. class Student
  2. {
  3. public:
  4.     char name[50];
  5.     int num;
  6.     int age;
  7.     Student(char* pname, int t_num, int t_age) :num(t_num), age(t_age)
  8.     {
  9.         strcpy(name, pname);
  10.     }

  11.     Student(Student& stud)
  12.     {
  13.         strcpy(name, stud.name);
  14.         num = stud.num;
  15.         age = stud.age;
  16.     }
  17. };
复制代码


6、拷贝构造函数的特点:
①、也是构造函数,所以函数名字就是类名字,并且无返回值;
②、参数上有点特殊,参数是一般是本类的对象的引用;
③、如果类没有提供拷贝构造函数,那么编译器会默认生成一个拷贝构造函数,作用比较单一,只是简单的将成员变量的值进行复制过去而已。

7、拷贝构造函数实现的必要性:
刚才已经跟大家说了,如果一个类没有提供拷贝构造函数,那么那么编译器会默认生成一个。既然编译器都可以默认生成了,我们为什么还要实现呢?
①、类的成员变量中有一些无法进行赋值的,此时就需要自定义实现拷贝构造函数;
②、针对类似上节课给大家讲解的 CStudent 类的实现方式上,调用起来也非常危险,咱们再来实验一下:
  1. void test()
  2. {
  3.     CStudent stud_1("zhangsan", 'f', 1001, 20);
  4.     CStudent stud_4(stud_1);
  5. }
复制代码


之后,我们来执行下代码,执行完 test 函数之后,程序又崩溃了。为什么呢?具体原因及解决方法见视频教程讲解!

8、小作业:
实现 CStudent 类的拷贝构造函数,让 第 7 点的代码不崩溃!要慎重 new 和 delete 哦!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38388453/?p=38
MP4高清视频下载地址:链接:https://pan.baidu.com/s/1DE_SNUy9lNDj0V7XTppKng 提取码:8o3y
本节课件下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复

备注:VIP会员可免费下载本站所有资源(点击查看)
提示:通过购买VC驿站U盘打包(点击查看)也可加入终身Vip会员^_^




上一篇:《实用C++》第35课 类的构造函数与析构函数
下一篇:《实用C++》第37课 类的静态成员
16_avatar_middle
最佳答案
0 
在线会员 发表于 2018-4-26 01:07:33 | 显示全部楼层
又更新了,支持Syc老大!《实用C++》第36课 对象的赋值与复制及拷贝构造函数
78_avatar_middle
最佳答案
0 
在线会员 发表于 2018-4-26 08:39:13 | 显示全部楼层
又更新啦,谢谢
98_avatar_middle
最佳答案
0 
在线会员 发表于 2018-4-26 09:12:55 | 显示全部楼层
谢谢  继续跟进
69_avatar_middle
最佳答案
0 
在线会员 发表于 2018-4-28 13:01:27 | 显示全部楼层
支持SYC老大,期待视频地址哦
43_avatar_middle
最佳答案
0 
online_vip 发表于 2018-4-28 15:02:38 | 显示全部楼层
支持支持!加油加油~
55_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-2 11:07:28 | 显示全部楼层
对象的赋值与复制及拷贝构造函数 太棒了!!!
84_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-3 07:20:15 | 显示全部楼层
感谢老师讲解。
80_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-3 08:40:11 | 显示全部楼层
坚持学习!
69_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-3 09:36:42 | 显示全部楼层
坚持学习!!!!!!
74_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-3 10:51:38 | 显示全部楼层
看看              
44_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-3 15:15:17 | 显示全部楼层
多谢楼主用心录制教程。
82_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-3 18:44:24 | 显示全部楼层
谢谢楼主分享
75_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-6 10:20:39 | 显示全部楼层
感谢楼主分享!
95_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-6 10:40:58 | 显示全部楼层
又更新了,支持Syc老大
94_avatar_middle
最佳答案
0 
online_vip 发表于 2018-5-7 17:41:25 | 显示全部楼层

感谢楼主分享!
22_avatar_middle
最佳答案
0 
online_vip 发表于 2018-5-8 23:42:58 | 显示全部楼层
继续学习.............
82_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-9 08:30:27 | 显示全部楼层
很想学习C++
17_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-9 17:20:39 | 显示全部楼层
又更新啦,谢谢
22_avatar_middle
最佳答案
0 
在线会员 发表于 2018-5-11 20:50:29 | 显示全部楼层
谢谢楼主分享
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-11-22 09:12

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表