首先我们来看一段简单的代码:
class A
{
public:
void set(string name, int age)
{
Name = name;
Age = age;
}
private:
string Name;
int Age;
};
int main()
{
A a1, a2;
a1.set("zhangsan", 18);
a2.set("lisi", 9);
return 0;
}
观察上面的这一段代码,这里有一个疑问:函数怎么知道哪一个对象需要被操作呢?
大家肯定都知道:当然是this指针在中间发挥作用咯!
下面我们来总结一下this指针的有关知识:
一.有一段经典的话就是用来描述this指针的:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。
看完这段话想必大家都已经明白了this指针是什么了吧。
二.this指针的特性
1.this指针是在什么时候构造的
this指针在成员函数开始前构造,在成员函数结束后消除。但是this指针并不属于对象,因此当用sizeof求对象大小的时候,并没有把this指针的大小算进去。
有细心的同学会发现,如果没有成员函数,那还有没有this指针呢?有,当然有!当一个类中没有了方法,这个类也就没有构造函数,这个class类就相当于c语言中的结构体。那么this指针指向的就是这块空间。
2.this指针的作用对象
this指针作用的是非static的成员函数,当然也不能是全局函数。为什么?因为this指针存在于类的成员函数中,指向被调用的成员函数的所在的实例。static函数属于类,但并不属于某一个具体对象。全局函数就更不必说了,它不属于类。由此可知,我们在成员函数外部是无法访问this指针的。
3.this指针成员函数中是以什么形式存在的
上文说this指针存在于类的成员函数中,那么它究竟是如何存在的?实际上,this指针是以隐含参数的形式传入成员函数里的(编译器会自动完成)。
比如类中的一个函数 void add(int x,int y);
而实际上它的参数列表是这样的 void add(A* const this,int x,int y);(A是类名)
因此this指针的生存周期和函数的参数一样长。
4.this指针如何传递参数
在调用函数之前,如果函数的参数个数一定,this指针通过ecx寄存器传递参数,否则,等所有函数参数压如栈中以后,this指针才被压入堆栈。
5.this指针的使用
它可以在非静态成员函数的内部使用。
它不可以在构造函数的初始化列表中使用,因为在初始化列表中,对象的构建还未完成,尚不可得知对象的内部结构,无法通过this对其进行访问。
三.this指针的使用
看一段代码:
class A
{
public:
A()
{
a = b = 0;
}
A(int i, int j)
{
a = i;
b = j;
}
void copy(A&aa);
void print()
{
cout << a << "," << b << endl;
}
private:
int a;
int b;
};
void A::copy(A&aa)
{
if (this == &aa)return;
*this = aa;
}
int main()
{
A a1, a2(3,4);
a1.copy(a2);
a1.print();
return 0;
}
在成员函数copy()中出现两次this指针,copy的具体作用是把对象a2拷贝给对象a1,this的作用在于判断要拷贝给的对象是不是自己本身。*this表示this指向的这一块空间,即对象a1,用来接收a2的内容。
本文详细解析了C++中的this指针概念及其工作原理,包括this指针的构造时机、作用对象、存在形式及使用限制等内容。
647

被折叠的 条评论
为什么被折叠?



