C++ ——this指针

发布于:2025-02-16 ⋅ 阅读:(38) ⋅ 点赞:(0)

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返回


网站公告

今日签到

点亮在社区的每一天
去签到