C++中的this指针,总结

  • this指针

    • 每个对象拥有一个this指针,通过this指针来访问自己的地址。

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

    • this指针只能在成员函数中使用,全局函数、静态函数都不能使用this指针

    • this指针在成员函数开始执行前构造,在成员函数执行结束后销毁

    • this 虽然用在类的内部,但是只有在对象被创建以后才会给 this 赋值,并且这个赋值的过程是编译器自动完成的,
      不需要用户干预,用户也不能显式地给 this 赋值。

1 在普通成员函数中,this是一个,指向非const对象的const指针

if class == Student
	this == Student *const 

2 在const成员函数中,this指针是一个,指向const对象的const指针

if class == Student
	this == const Student *const 

下面我们看下,this 确实指向了当前对象,而且对于不同的对象,this 的值也不一样

#include<iostream>
using namespace std;
class Student{
public:
	int a;
	int b;
    void printThis();
    void print();
};
void Student::printThis(){
    cout<<this<<endl;
}
int main(int argc, char const *argv[])
{
    Student *pstu1 = new Student;
    pstu1 -> printThis();
    cout<<pstu1<<endl;
    
    Student *pstu2 = new Student;
    pstu2 -> printThis();
    cout<<pstu2<<endl;
    return 0;
}
输出:
0x7fba0ec00670
0x7fba0ec00670
0x7fba0ec00680
0x7fba0ec00680
  • this指针到底是什么?
    this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this
    不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中

这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。

  • 如何更深人的理解一下呢?

C++和C语言的编译方式不同。C语言中的函数在编译时名字不变,或者只是简单的加一个下划线_(不同的编译器有不同的实现),
例如,func() 编译后为 func() 或 _func()。

而C++中的函数在编译时会根据它所在的命名空间、它所属的类、以及它的参数列表(也叫参数签名)等信息进行重新命名,
形成一个新的函数名
。这个新的函数名只有编译器知道,对用户是不可见的。对函数重命名的过程叫做名字编码(Name Mangling),是通过一种特殊的算法来实现的。

Name Mangling 的算法是可逆的,既可以通过现有函数名计算出新函数名,也可以通过新函数名逆向推演出原有函数名。

Name Mangling 可以确保新函数名的唯一性,只要函数所在的命名空间、所属的类、包含的参数列表等有一个不同,最后产生的新函数名也不同
如果你希望看到经 Name Mangling 产生的新函数名,可以只声明而不定义函数,这样调用函数时就会产生链接错误,从报错信息中就可以看到新函数名。

扯得有点远了,我们来看下,成员函数的调用

void Student::print()
{
	cout<<a<<endl;
	cout<<b<<endl;
}
//编译后的代码,类似于
void new_function_name(Student* const this)
{
	cout<<this->a<<endl;
	cout<<this->b<<endl;
}

这样通过传递对象指针就完成了成员函数和成员变量的关联。
这与我们从表明上看到的刚好相反,通过对象调用成员函数时,不是通过对象找函数,而是通过函数找对象

这一切都是隐式完成的,对程序员来说完全透明,就好像这个额外的参数this指针不存在一样

发布了30 篇原创文章 · 获赞 5 · 访问量 2205

猜你喜欢

转载自blog.csdn.net/weixin_44408476/article/details/105193219
今日推荐