this指针详解
来源:互联网 发布:吃喝玩乐软件哪个好 编辑:程序博客网 时间:2024/06/02 06:23
首先我们来看一段简单的代码:
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的内容。
- 详解this指针
- 详解c++ this 指针
- this 指针详解
- C++ This指针详解
- Javascript this指针详解
- this指针详解
- C++ this 指针详解
- c++ this 指针详解
- C++ this 指针详解
- C++ this指针详解
- C++ this指针详解
- this指针用法详解
- C++this指针详解
- this指针详解
- this指针详解
- C++ this指针详解
- C++ this 指针详解
- C++ this 指针详解
- Android实现手写板和涂鸦功能
- 深入学习微框架:Spring Boot
- uva 514 Rails
- 当你困惑IO中file 和directory 的区别。
- 使用Canvas绘制不完美/不规则的圆形
- this指针详解
- hdu 3555 数位dp的dfs写法
- python监测当前联网状态并连接
- 利用单目视觉做NAO机器人摄像头坐标转换
- fflush()刷新缓冲流函数
- android Activity深层次研究
- mysql基本操作,创建、删除用户并授权给数据库,创建、删除、查看数据库和表
- 【转】深入浅出ShellExecute
- 复数运算符重载(3)