一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象的地址。全局仅有一个this指针,当一个对象被创建时,this指针就指向对象数据的首地址。
每一个非静态成员函数里面都有一个隐式的this指针,它指向当前调用函数的对象。
比如 stu.Output(); this 指向stu的首地址。
1、其实在编译器内部,成员函数和非成员函数的调用是一样的。你定义了一个类的成员函数,编译器会把它变成一个普通函数,为了知道哪一个对象调用了该函数,它会插入一个参数,比如
class test
{
……
void fun(int i){}
……
};
针对fun编译器生成的的全局函数是
void fun(test* this,int i){}//没考虑重命名机制
如果有这样的应用
test t1;
t1.fun(2);//case 1
对于case 1编译器生成的代码是
fun(&t1,2);
2、如果成员函数是const修饰的
class test
{
……
void fun(int i) const{}
……
};
那么编译器的处理是
void fun(const test* this,int i){}
也就是说,你不能改变this指向的对象
3、至于static修饰的函数,它不属于任何类,因此编译器不会插入this指针。
4、若是要返回对象的引用的话,可以这样
class test
{
……
test& fun(int i) const{return *this;}
……
};