C++之this指针

文章目录

什么是this指针

  • 不同的对象各自拥有独立的成员变量,但它们共享同一份成员函数代码,那么在成员函数中如何区分所访问的成员变量隶属于哪个对象?
    • 是this指针
cpp 复制代码
#include <iostream>
using namespace std;
class Student{
public:
    Student(int age, const string &name){
        m_age = age;
        m_name = name;
    }
    void print(){
        cout << m_name << ":" << m_age << endl;
    }
private:
    int m_age;
    string m_name;
};
int main(void){
    Student zs(12, "zhangsan");
    Student ls = Student(13, "lisi");
    zs.print();
    ls.print();
    return 0;
}
  • this是一个用于标识对象自身的隐式指针,代表对象自身的地址
  • 在编译类成员函数时,C++编译器会自动将this指针添加到成员函数的参数表中。在用类的成员函数时,调用对象会把自己的地址通过this指针传递给成员函数
  • 以上程序编译器编译后的样子,大致如下:
cpp 复制代码
#include <iostream>
using namespace std;
class Student{
public:
    Student(Student *this, int age, const string &name){
        this->m_age = age;
        this->m_name = name;
    }
    void print(Student *this){
        cout << this->m_name << ":" << this->m_age << endl;
    }
private:
    int m_age;
    string m_name;
};
int main(void){
    Student zs(12, "zhangsan"); // (&zs, 12, "zhangsan")
    Student ls = Student(13, "lisi");
    zs.print(); //print(&zs)
    ls.print();//print(&ls)
    return 0;
}

this指针的应用

  • 需要显示使用this指针的常见场景:
    • 类中的成员变量和参数变量名字一样,可以通过this指针区分
    • 从成员函数中返回调用对象自身(返回自引用),支持链式调用
    • 在成员函数中销毁对象自身(对象自销毁)
cpp 复制代码
#include <iostream>
using namespace std;
class Counter{
private:
    int count;
public:
    Counter(int count = 0){
        this->count = count;
    }
    Counter &add(void){
        ++count;
    return *this;
    }
    void print(void){
        cout << count << endl;
    }
    void destroy(void){
        cout <<"this : " << this << endl;
        delete this; //销毁对象本身
    }
};
int main(void){
    Counter cnt;
    cnt.print();
    cnt.add().add().add();
    cnt.print();
    Counter *pcn = new Counter;
    pcn->add();
    pcn->print();
    pcn->destroy();
    cout<<"pcn: " <<pcn <<endl;
    return 0;
}
相关推荐
2401_8920709817 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei18 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
不爱吃炸鸡柳18 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发18 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎18 小时前
STL 栈 队列
开发语言·c++
2401_8920709819 小时前
【Linux C++ 日志系统实战】高性能文件写入 AppendFile 核心方法解析
linux·c++·日志系统·文件写对象
郭涤生19 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿19 小时前
vector
c语言·开发语言·数据结构·c++·算法
cccyi719 小时前
【C++ 脚手架】etcd 的介绍与使用
c++·服务发现·etcd·服务注册
liu****19 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯