VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 959|回复: 28

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

[复制链接]
51_avatar_middle
online_admins Syc 发表于 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中把以上代码敲一遍,之后看看结果是多少?

相关的原因可以参考这篇帖子:内存对齐相关说明:http://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指针的作用域是哪里?

第32课免费试看,下载地址回复后可见:
游客,如果您要查看本帖隐藏内容请回复

#######################################################
获得所有教学视频、课件、源代码以及售后答疑详见:
《实用C++》:http://www.cctry.com/thread-275996-1-1.html
VC驿站官方客服QQ:8260671

#######################################################

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

98_avatar_middle
online_member tomok 发表于 2018-4-17 08:46:13 | 显示全部楼层
学习  啦


发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

43_avatar_middle
online_vip Conanmilk 发表于 2018-4-17 14:38:02 | 显示全部楼层
支持支持!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

78_avatar_middle
online_member csa 发表于 2018-4-18 09:19:55 | 显示全部楼层
又更新啦。不错,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

69_avatar_middle
online_member awfymwvf 发表于 2018-4-18 09:50:31 | 显示全部楼层
谢谢SYC大神,期待视频下载

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
online_member zp521 发表于 2018-4-19 08:27:35 | 显示全部楼层
坚持学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
online_vip08 wssfcn 发表于 2018-4-19 09:33:22 | 显示全部楼层
看看              

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

44_avatar_middle
online_member a281288098 发表于 2018-4-19 13:13:03 | 显示全部楼层
感谢老师录制的教程。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

84_avatar_middle
online_member glgh 发表于 2018-4-19 17:40:52 | 显示全部楼层
谢谢分享。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

22_avatar_middle
online_vip jesy 发表于 2018-4-19 20:27:39 | 显示全部楼层
来学习了.........................

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

89_avatar_middle
online_member yyanjun 发表于 2018-4-20 20:16:20 | 显示全部楼层
this指针,嘻嘻支持VC驿站

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

61_avatar_middle
online_member tingwei3 发表于 2018-4-20 23:00:16 | 显示全部楼层
试试学习学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
online_member DetectiveY 发表于 2018-4-22 10:52:53 | 显示全部楼层
谢谢分享,继续学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

08_avatar_middle
online_member guanghua1982 发表于 2018-4-23 23:04:47 | 显示全部楼层
跟着老师学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

55_avatar_middle
online_member Smallbee 发表于 2018-4-24 16:02:05 | 显示全部楼层
this指针——this指代谁?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

94_avatar_middle
online_vip08 Mtong 发表于 2018-4-25 12:38:37 | 显示全部楼层
his指针——

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

05_avatar_middle
online_member 625136403 发表于 2018-4-26 20:03:27 | 显示全部楼层
好好学习好好学习好好学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

79_avatar_middle
online_member asia 发表于 2018-4-28 11:34:37 | 显示全部楼层
下来研究一下

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
online_member ha521ha 发表于 2018-4-29 09:19:15 | 显示全部楼层
一直很想学习C++

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

95_avatar_middle
online_member zjh2008 发表于 2018-5-6 10:34:20 | 显示全部楼层
老大又更新了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

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

GMT+8, 2018-5-21 15:06

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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