VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3753|回复: 91

《实用C++》第32课 this指针

  [复制链接]
51_avatar_middle
online_admins 发表于 2018-4-17 00:32:03 | 显示全部楼层 |阅读模式
1、成员函数的存储方式:
讲解 this 指针之前,先来说说类的成员函数的存储方式!
用类实例化定义一个对象的时候,就好比是用int定义一个变量一样,系统会为该对象分配存储的内存空间。例如一个学生类:
  1. class Student
  2. {
  3. public:
  4.     char name[50];
  5.     int num;
  6.     int age;

  7. public:
  8.     void print_name()
  9.     {
  10.             cout << "name = " << name << endl;
  11.     };
  12. };
复制代码


用这个学生类定义一个对象:
  1. Student stud = {0};
  2. int stud_size = sizeof(stud);
复制代码

这个 stud_size 是多少呢?大家先不放分析一下,之后再到 VS2013中把以上代码敲一遍,之后看看结果是多少?

相关的原因可以参考这篇帖子:内存对齐相关说明:https://www.cctry.com/thread-289483-1-1.html

得到结论:C++语言中每个对象所占用的存储空间只是该对象的数据成员所占用的存储空间,而不包括函数代码所占用的存储空间。
因为针对某个类的多个对象而言,不同的只是数据成员,而函数成员来说都是一样的代码,所以没有必要为每个对象都保存一份成员函数的代码。这样可以很大程度上节省空间。

2、this指针:
上面已经跟大家讲解过了,既然成员函数不占用对象的存储空间,或者说多个对象是共用一个成员函数的,那么问题就来了。在调用成员函数的时候,函数如何区分是哪一个对象调用的呢?
例如:
  1. Student zhang_san, li_si;
  2. strcpy(zhang_san.name, "zhang_san");
  3. strcpy(li_si.name, "li_si");

  4. zhang_san.print_name();
  5. li_si.print_name();
复制代码

这两条打印语句很很明显,打印出的结果肯定不同,张三就打印出张三的名字,李四就打印出李四的名字。那么 print_name 是如何来区分是张三对象还是李四对象呢?答案的关键就是:this 指针。

在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为 this,它也是C++中的保留关键字,它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。所以,当对象调用成员函数的时候,如:zhang_san.print_name(); 则系统会把 zhang_san 对象的地址赋值给 this 指针,所以在 print_name 函数的内部调用 cout 打印 name 成员的时候,实际上就是 this->name 这样调用的。只不过这里面的 this 可以省略不写,默认就是调用当前对象的。

3、关于 this 指针的一个很形象的比喻:
当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。
对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。
举例给大家说明,具体说明见视频教程!

4、什么情况下需要手动加上this:
例如:
  1. class Student
  2. {
  3. public:
  4.     char name[50];
  5.     int num;
  6.     int age;

  7. public:
  8.     void set_age(int age)
  9.     {
  10.             age = age;
  11.     };
  12. };
复制代码


大家看到了吗?set_age 函数的参数名字和成员变量的名字一样,都是age,那么这样的情况下,大家说说成员变量的age是否能真的赋值呢?大家不妨先把视频教程暂停,自己实践下,之后再继续播放教程!
不同的编译器可能实现的结果不同,但是在我们的vs2013中,答案是否定的。成员变量age并没有通过函数 set_age 被正确的赋值。那么这个时候怎么办呢?解决的方法是将 set_age 函数改成如下:
  1. void set_age(int age)
  2. {
  3.     this->age = age;
  4. };
复制代码


5、小作业:
自己查找资料,详细说明this指针的作用域是哪里?


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

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





上一篇:《实用C++》第31课 类的成员函数
下一篇:《实用C++》第33课 类的构造函数
98_avatar_middle
在线会员 发表于 2018-4-17 08:46:13 | 显示全部楼层
学习  啦


43_avatar_middle
online_vip 发表于 2018-4-17 14:38:02 | 显示全部楼层
支持支持!!!
78_avatar_middle
在线会员 发表于 2018-4-18 09:19:55 | 显示全部楼层
又更新啦。不错,谢谢
69_avatar_middle
在线会员 发表于 2018-4-18 09:50:31 | 显示全部楼层
谢谢SYC大神,期待视频下载
80_avatar_middle
在线会员 发表于 2018-4-19 08:27:35 | 显示全部楼层
坚持学习!
74_avatar_middle
在线会员 发表于 2018-4-19 09:33:22 | 显示全部楼层
看看              
44_avatar_middle
在线会员 发表于 2018-4-19 13:13:03 | 显示全部楼层
感谢老师录制的教程。
84_avatar_middle
在线会员 发表于 2018-4-19 17:40:52 | 显示全部楼层
谢谢分享。
22_avatar_middle
online_vip 发表于 2018-4-19 20:27:39 | 显示全部楼层
来学习了.........................
89_avatar_middle
在线会员 发表于 2018-4-20 20:16:20 | 显示全部楼层
this指针,嘻嘻支持VC驿站
61_avatar_middle
在线会员 发表于 2018-4-20 23:00:16 | 显示全部楼层
试试学习学习
82_avatar_middle
在线会员 发表于 2018-4-22 10:52:53 | 显示全部楼层
谢谢分享,继续学习
08_avatar_middle
在线会员 发表于 2018-4-23 23:04:47 | 显示全部楼层
跟着老师学习!
55_avatar_middle
在线会员 发表于 2018-4-24 16:02:05 | 显示全部楼层
this指针——this指代谁?
94_avatar_middle
online_vip 发表于 2018-4-25 12:38:37 | 显示全部楼层
his指针——
05_avatar_middle
在线会员 发表于 2018-4-26 20:03:27 | 显示全部楼层
好好学习好好学习好好学习
79_avatar_middle
在线会员 发表于 2018-4-28 11:34:37 | 显示全部楼层
下来研究一下
82_avatar_middle
在线会员 发表于 2018-4-29 09:19:15 | 显示全部楼层
一直很想学习C++
95_avatar_middle
在线会员 发表于 2018-5-6 10:34:20 | 显示全部楼层
老大又更新了
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

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

GMT+8, 2019-1-20 03:42

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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