C++ this指针

一、this指针

首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。

this是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。

this指针的类型取决于使用this指针的成员函数类型以及对象类型。

注:this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。

this指针作用:

this作用域是在类的内部,自己声明一个类的时候,还不知道实例化对象的名字,所以用this来使用对象变量的自身。在非静态成员函数中,编译器在编译的时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。 
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)

代码示例

#include<iostream>
using namespace std;

/**************
要求:
定义一个Array类
	数据成员:len表示数组长度
	成员函数:析构、构造、len的封装函数、信息输出函数printInfo
***************/

class Array
{
public:
    Array(int len);//将参数定义的与数据成员相同
    ~Array();
    void setLen(int len);
    int getLen();
    Array printInfo();
private:
    int len;
};

Array::Array(int len)
{
    this->len = len;
}
Array::~Array()
{

}

void Array::setLen(int len)
{
    this->len = len;
}

int Array::getLen()
{
    return len;
}

Array Array::printInfo()//返回类型是一个对象
{
    cout<<"len="<<len<<endl;
    return *this;//this本身是一个指针 ,加上*后就是一个对象
}

int main()
{
    Array arr1(10);
    arr1.printInfo();
    arr1.printInfo().setLen(5);//因为printInfo()函数的返回值是*this,是一个对象,所以可以利用.继续访问该对象的成员函数
    cout<<arr1.getLen()<<endl;

    return 0;
}

运行结果:

根据运行结果,打印出len=10说明printInfo被正常调用了,我们用返回的*this去继续访问setLen()函数,打印出的len的长度依然为10,并没有改变arr1的值;因为在printInfo()函数中,返回的*this就变成了另外一个对象,这个对象是一个临时对象,并不是arr1,所以无法改变arr1中数据成员的值;如果想让他能够改变arr1中数据成员的值,则将返回类型改为引用,那么return *this返回的就是对象本身

修改之后的代码:

#include<iostream>
using namespace std;

/**************
要求:
定义一个Array类
	数据成员:len表示数组长度
	成员函数:析构、构造、len的封装函数、信息输出函数printInfo
***************/

class Array
{
public:
    Array(int len);//将参数定义的与数据成员相同
    ~Array();
    void setLen(int len);
    int getLen();
    Array& printInfo();
private:
    int len;
};

Array::Array(int len)
{
    this->len = len;
}
Array::~Array()
{

}

void Array::setLen(int len)
{
    this->len = len;
}

int Array::getLen()
{
    return len;
}

Array& Array::printInfo()//返回类型是一个引用
{
    cout<<"len="<<len<<endl;
    return *this;//this本身是一个指针 ,加上*后就是一个对象
}

int main()
{
    Array arr1(10);
    arr1.printInfo();
    arr1.printInfo().setLen(5);//因为printInfo()函数的返回值是*this,是一个对象,所以可以利用.继续访问该对象的成员函数
    cout<<arr1.getLen()<<endl;

    return 0;
}

运行结果:

this指针的本质就是他所在对象的地址!

利用代码证明

#include<iostream>
using namespace std;

/**************
要求:
定义一个Array类
	数据成员:len表示数组长度
	成员函数:析构、构造、len的封装函数、信息输出函数printInfo
***************/

class Array
{
public:
    Array(int len);//将参数定义的与数据成员相同
    ~Array();
    void setLen(int len);
    int getLen();
    Array& printInfo();
private:
    int len;
};

Array::Array(int len)
{
    this->len = len;
}
Array::~Array()
{

}

void Array::setLen(int len)
{
    this->len = len;
}

int Array::getLen()
{
    return len;
}

Array& Array::printInfo()
{
    cout<<this<<endl;
    return *this;
}

int main()
{
    Array arr1(10);
    arr1.printInfo();//打印this指针的地址
    cout<<&arr1<<endl;//打印arr1的地址

    return 0;
}

运行结果:

根据运行结果,我们看到this指针的地址和arr1地址相同,说明了this指针的本质就是他所在对象的地址。

 

this指针有哪些特性?
- 类型:类类型*const
- this指针并不是类本身的一部分,不影响sizeof(类)的大小
- this指针作用域在类成员函数内部
- this指针是非静态成员函数的一个隐含指针形参,是编译器自己给的,不能由程序员手动添加。

部分参考博客:

浅析C++this指针

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值