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; //16ls->add_age(2);cout<<ls->get_age()<<endl; //18ls->add_age(10);cout<<ls->get_age()<<endl; //28ls->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返回