前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++:19---this指针

C++:19---this指针

作者头像
用户3479834
发布2021-02-03 15:44:54
5040
发布2021-02-03 15:44:54
举报
文章被收录于专栏:游戏开发司机游戏开发司机

一、this指针介绍

  • 概念:this指针是成员函数的一个隐式参数,在类中本质上就是对象的指针(常量指针)
  • 特点:
    • 在成员函数中可通过this指针区别成员变量与形参变量
    • this可以显式调用
  • 示例代码:
代码语言:javascript
复制
class Cperson
{
private:
int age;
float height;
public:
void InitPerson(int age,float height);
};
void Cperson::InitPerson(int age,float height)
{
this->age=age;
this->height=height;
}

二、返回*this成员函数

  • 概念:返回值是*this,也就是返回调用此成员函数的对象的自身引用,返回值类型为对象引用类型
代码语言:javascript
复制
class Person
{
private:
int age;
public:
Person& setAge(int age);//返回自身引用
};
Person& Person::setAge(int age)
{
this->age=age;
return *this;//返回*this(自身引用)
}
  • 从const成员函数返回*this:如果一个const成员函数返回*this,那么此函数的返回值类型是常量引用:比如上面的代码中的setAge函数变为常量成员函数
代码语言:javascript
复制
const Person& setAge(int age)const;

三、this指针剖析

this指针剖析

  • 对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。当程序被编译之后,此成员函数地址已经确定
  • 我们常说,调用类的成员函数时,会将当前对象的this指针传递给成员函数:
    • 上面我们说了,一个类的成员函数只定义了一份,所有对象共用这个成员函数体
    • 那么如何区分哪个对象调用此函数呢?这就是this指针的作用,每次对象调用成员函数时,将this指针(对象首地址)传递给成员函数,然后在函数体内对类的数据成员访问时,就会被转换为“this->数据成员”的形式
  • 如果成员函数内部没有访问对象的任何数据成员,那么传进来的this指针实际没有任何用处,这样的函数与全局函数并没有太大区别

演示案例

代码语言:javascript
复制
#include <iostream>
using namespace std;
class MyClass
{
public:
int data;
MyClass(int data)
{
this->data = data;
}
void print()
{
//cout<< data << endl;
cout << "hello!" << endl;
}
};
int main()
{
MyClass *pMyClass;
pMyClass = new MyClass(1);
pMyClass->print();
pMyClass[0].print();
pMyClass[1].print();
pMyClass[10000000].print();
return 0;
}
  • 运行效果如下所示:
  • 结果分析:
    • 此处我们创建了一个对象,但是访问后面越界之后仍然可以访问成功
    • 上面我们说过了,如果一个成员函数没有操作任何类的数据成员,因此这个成员函数与全局函数类型,调用之后都会打印“hello!”
  • 但是如果把14行的代码取消注释会怎么样呢?见下面演示案例

代码改进

代码语言:javascript
复制
#include <iostream>
using namespace std;
class MyClass
{
public:
int data;
MyClass(int data)
{
this->data = data;
}
void print()
{
//cout<< data << endl;
cout << "hello!" << endl;
}
};
int main()
{
MyClass *pMyClass;
pMyClass = new MyClass(1);
pMyClass->print();
pMyClass[0].print();
pMyClass[1].print();
pMyClass[10000000].print();
return 0;
}
  • 运行效果如下所示:
  • 结果分析:
    • 此处我们的成员函数访问了类的数据成员,那么每次打印数据时都会通过this指针调用
    • 但是此处我们只创建了一个对象,所以当调用pMyClass[1]和pMyClass[10000000]越界了,找不到对象,从而报错
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、this指针介绍
  • 二、返回*this成员函数
  • 三、this指针剖析
    • this指针剖析
      • 演示案例
        • 代码改进
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档