当前位置: 首页 > news >正文

C++ ——this指针

1、概念

(1)this指针是一个特殊的指针,存储的对象的首地址

(2)类的成员函数(包括构造函数和析构函数)内部,隐含一个this指针,指向对象的首地址

(3)类内部,访问对象的成员变量或者调用对象的成员方法,都是通过this指针完成的,即使没有显示写出this,编译器也会自动添加

this指向谁?谁调用指向谁(哪个对象调用就指向哪个对象的首地址)

2、应用

2.1 区分同名参数和成员属性

class Person{
private:
    int age;
    string name;
public:
    //可以用this指针来区分同名参数和成员属性
    Person(int age,string name){
        this->age=age;
        this->name=name;
        cout<<this<<endl;
    }
};

2.2 类中成员的调用都是依赖于this指针的

    void show(){
        //类中成员的调用都是依赖于this指针完成的,即使不加this,默认编译器也会自动添加
        cout<<"姓名:"<<this->name<<",年龄:"<<age<<endl;
        cout<<this<<endl;
    }

2.3 链式调用

当返回值是对象引用时,可以返回*this,此函数支持链式调用

支持链式调用的成员函数的特点:

        (1)返回值类型是当前类的引用

        (2)return后面是*this

#include <iostream>
using namespace std;
class Person{
private:
    int age;
    string name;
public:
    Person(int age,string name){
        this->age=age;
        this->name=name;
        cout<<this<<endl;
    }
    void show(){
        cout<<"姓名:"<<this->name<<",年龄:"<<age<<endl;
        cout<<this<<endl;
    }
    int get_age(){
        return age;
    }
    ~Person(){
        cout<<"ga"<<endl;
        cout<<this<<endl;
    }
    //可以实现链式调用
    Person&add_age(int num){
        this->age+=num;
        return*this;
    }
};
int main(){
    Person zs(18,"zs");
    zs.show();
    Person*ls=new Person(16,"ls");
    //普通调用
    cout<<ls->get_age()<<endl;  //16
    ls->add_age(2);
    cout<<ls->get_age()<<endl;  //18
    ls->add_age(10);
    cout<<ls->get_age()<<endl;  //28
    ls->add_age(3);
    cout<<ls->get_age()<<endl;  //31
    //链式调用
    cout<<ls->add_age(2).add_age(3).add_age(10).get_age()<<endl;  //46
    return 0;
}

 

面试题 

new的过程(创建对象的过程):

1、内存分配

(1)new运算符首先调用底层的内存分配函数(通常是operator new),为对象分配足够的内存空间

(2)如果内存分配失败(例如,由于内存不足),operator new会抛出一个std::bad_alloc异常

2、构造函数调用

(1)一旦内存分配成功,new运算符会在分配的内存上调用对象的构造函数来初始化对象属性

(2)这意味着对象的成员变量会被初始化,并且任何在构造函数中编写的初始化代码都会被执行

3、返回指针

最后,将初始化过的对象的首地址赋值给this, 并将this返回

http://www.dtcms.com/a/20204.html

相关文章:

  • Rhel Centos环境开关机自动脚本
  • flutter本地推送 flutter_local_notifications的使用记录
  • Java面试题总结 - Java集合篇(附答案)
  • 一种访问网络中主机图片的方法
  • 深度学习框架PyTorch
  • 4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享
  • 鸿蒙Next开发-添加水印以及点击穿透设置
  • c++中什么时候应该使用final关键字?
  • 143,【3】 buuctf web [GYCTF2020]EasyThinking
  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析③】
  • 强化学习-NPG
  • Zbrush导入笔刷
  • 解锁电商数据宝藏:淘宝商品详情API实战指南
  • 内容中台构建高效数字化内容管理新范式
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十三节】
  • 硬件开发笔记(三十四):AHD转MIPI国产方案详解XS9922B(一):芯片方案介绍
  • kubekey一键部署k8s高可用与kubesphere
  • 图像质量评价指标-UCIQE-UIQM
  • Ext系列文件系统
  • CAS单点登录(第7版)14.服务与应用
  • HCIA项目实践--静态路由的总结和简单配置
  • CAS单点登录(第7版)23.Webflow 管理
  • 《探秘AI绿色计算:降低人工智能硬件能耗的热点技术》
  • Atlassian工具集:Jira与Confluence集成优势、使用技巧、更新功能等
  • 【R语言】回归分析
  • C++入门小清单
  • 简要分析LeetCode树经典题目(Java)
  • vscode调试redis
  • 如何构建一个AI驱动的前端UI组件生成器
  • Streamlit与Qlib:量化投资策略可视化实战