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

本文转载自:VC驿站

https://www.cctry.com/thread-289911-1-1.html

1、成员函数的存储方式:
讲解 this 指针之前,先来说说类的成员函数的存储方式!
用类实例化定义一个对象的时候,就好比是用int定义一个变量一样,系统会为该对象分配存储的内存空间。例如一个学生类:

class Student
{
public:
    char name[50];
    int num;
    int age;

public:
    void print_name()
    {
            cout << "name = " << name << endl;
    };
};

用这个学生类定义一个对象:

Student stud = {0};
int stud_size = sizeof(stud);

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

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

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

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

Student zhang_san, li_si;
strcpy(zhang_san.name, "zhang_san");
strcpy(li_si.name, "li_si");

zhang_san.print_name();
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:
例如:

class Student
{
public:
    char name[50];
    int num;
    int age;

public:
    void set_age(int age)
    {
            age = age;
    };
};

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

void set_age(int age)
{
    this->age = age;
};

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

第32课视频教程下载地址:

https://www.cctry.com/thread-289911-1-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值