This指针是在实例化一个对象后产生的,并且指向对象本身。
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
类的this指针有以下特点
(1)this指针只能在成员函数中使用。全局函数、静态函数中不能使用this指针。
(2)this指针在成员函数的开始前构造,在成员函数结束后清除。这个生命周期和函数的参数是一致的。实际上,成员函数默认的第一个参数为T* const this。例如:
class A{
public:
int func(int p){}
}
函数func的原型在编译器中应该是:int func(A* const this,int p);
由于this指针被声明为* const,它是一个指针常量,因此不能改变它的值(在低版本的C++中,修改this指针是可以的),但可以改变它所指对象的值。
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
类的this指针有以下特点
(1)this指针只能在成员函数中使用。全局函数、静态函数中不能使用this指针。
(2)this指针在成员函数的开始前构造,在成员函数结束后清除。这个生命周期和函数的参数是一致的。实际上,成员函数默认的第一个参数为T* const this。例如:
class A{
public:
int func(int p){}
}
函数func的原型在编译器中应该是:int func(A* const this,int p);
由于this指针被声明为* const,它是一个指针常量,因此不能改变它的值(在低版本的C++中,修改this指针是可以的),但可以改变它所指对象的值。
this指针的作用(1)限定被相似的名称隐藏的成员.
例如:
public Person(string name, string sex)
{
this.name = name;
this.sex = sex;
}
(2)在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;
几个关于this指针的问题(1)this指针在成员函数的开始前构造,在成员函数结束后清除。this指针指向的是实例化对象的地址。
(2)this指针存放在何处?堆、栈、全局变量?
this指针因为编译器的不同会有不同的放置位置,可能是栈,也可能是寄存器,甚至是全局变量。
(3)this指针是如何传递给类中的函数的?
this是通过函数参数的首参数来传递的,也就是说成员函数默认的第一个参数为T* const this.
(4)获得一个对象后,只有在成员函数里才能知道this指针的位置,可以通过&this来获取。因为this指针只有在成员函数中才有定义,因此只能在成员函数中使用指针。
(5)每个类编译后,是否创建一个类中函数表来保存函数指针,以便用来调用函数?
普通的类函数(无论是成员函数还是静态函数)都不会创建一个函数表来保存函数指针。只有虚函数才会被放到函数表中。
关于this指针的一个精典回答:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身
例如:
public Person(string name, string sex)
{
this.name = name;
this.sex = sex;
}
(2)在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;
几个关于this指针的问题(1)this指针在成员函数的开始前构造,在成员函数结束后清除。this指针指向的是实例化对象的地址。
(2)this指针存放在何处?堆、栈、全局变量?
this指针因为编译器的不同会有不同的放置位置,可能是栈,也可能是寄存器,甚至是全局变量。
(3)this指针是如何传递给类中的函数的?
this是通过函数参数的首参数来传递的,也就是说成员函数默认的第一个参数为T* const this.
(4)获得一个对象后,只有在成员函数里才能知道this指针的位置,可以通过&this来获取。因为this指针只有在成员函数中才有定义,因此只能在成员函数中使用指针。
(5)每个类编译后,是否创建一个类中函数表来保存函数指针,以便用来调用函数?
普通的类函数(无论是成员函数还是静态函数)都不会创建一个函数表来保存函数指针。只有虚函数才会被放到函数表中。
关于this指针的一个精典回答:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身
Aucun commentaire:
Enregistrer un commentaire