'this' pointer in C++
The ‘this’ pointer is passed as a hidden argument to all nonstatic member function calls and is available as a local variable within the body of all nonstatic functions. 'this' pointer is a constant pointer that holds the memory address of the current object. ‘this’ pointer is not available in static member functions as static member functions can be called without any object (with class name).
For a class X, the type of this pointer is ‘X* const’. Also, if a member function of X is declared as const, then the type of this pointer is ‘const X *const’.
Following are the situations where ‘this’ pointer is used:
(1)When local variable’s name is same as member’s name
1 #include<iostream>
2 using namespace std;
3
4 /* local variable is same as a member's name */
5 class Test
6 {
7 private:
8 int x;
9 public:
10 void setX (int x)
11 {
12 // The 'this' pointer is used to retrieve the object's x
13 // hidden by the local variable 'x'
14 this->x = x;
15 }
16 void print()
17 {
18 cout << "x = " << x << endl;
19 }
20 };
21
22 int main()
23 {
24 Test obj;
25 int x = 20;
26 obj.setX(x);
27 obj.print();
28 return 0;
29 }
Output:
x = 20
For constructors, initializer list can also be used when parameter name is same as member’s name.
(2)To return reference to the calling object
1 /* Reference to the calling object can be returned */
2 Test& Test::func ()
3 {
4 // Some processing
5 return *this;
6 }
When a reference to a local object is returned, the returned reference can be used to chain function calls on a single object.
1 #include<iostream>
2 using namespace std;
3
4 class Test
5 {
6 private:
7 int x;
8 int y;
9 public:
10 Test(int x = 0, int y = 0)
11 {
12 this->x = x;
13 this->y = y;
14 }
15 Test &setX(int a)
16 {
17 x = a;
18 return *this;
19 }
20 Test &setY(int b)
21 {
22 y = b;
23 return *this;
24 }
25 void print()
26 {
27 cout << "x = " << x << " y = " << y << endl;
28 }
29 };
30
31 int main()
32 {
33 Test obj1(5, 5);
34
35 // Chained function calls. All calls modify the same object
36 // as the same object is returned by reference
37 obj1.setX(10).setY(20);
38
39 obj1.print();
40 return 0;
41 }
Output:
x = 10 y = 20
Exercise:
Predict the output of following programs. If there are compilation errors, then fix them.
Question 1
1 #include<iostream>
2 using namespace std;
3
4 class Test
5 {
6 private:
7 int x;
8 public:
9 Test(int x = 0)
10 {
11 this->x = x;
12 }
13 void change(Test *t)
14 {
15 this = t;
16 }
17 void print()
18 {
19 cout << "x = " << x << endl;
20 }
21 };
22
23 int main()
24 {
25 Test obj(5);
26 Test *ptr = new Test (10);
27 obj.change(ptr);
28 obj.print();
29 return 0;
30 }
类Test的成员函数change有问题,现修改为:
1 void change(Test *t)
2 {
3 *this = *t;
4 }
因为this指针为const指针,其本身无法进行修改。修改后的输出内容为: 10
Question 2
1 #include<iostream>
2 using namespace std;
3
4 class Test
5 {
6 private:
7 int x;
8 int y;
9 public:
10 Test(int x = 0, int y = 0)
11 {
12 this->x = x;
13 this->y = y;
14 }
15 static void fun1()
16 {
17 cout << "Inside fun1()";
18 }
19 static void fun2()
20 {
21 cout << "Inside fun2()";
22 this->fun1();
23 }
24 };
25
26 int main()
27 {
28 Test obj;
29 obj.fun2();
30 return 0;
31 }
编译错误:"'fun2' : static member functions do not have 'this' pointers"
Question 3
1 #include<iostream>
2 using namespace std;
3
4 class Test
5 {
6 private:
7 int x;
8 int y;
9 public:
10 Test (int x = 0, int y = 0)
11 {
12 this->x = x;
13 this->y = y;
14 }
15 Test setX(int a)
16 {
17 x = a;
18 return *this;
19 }
20 Test setY(int b)
21 {
22 y = b;
23 return *this;
24 }
25 void print()
26 {
27 cout << "x = " << x << " y = " << y << endl;
28 }
29 };
30
31 int main()
32 {
33 Test obj1;
34 obj1.setX(10).setY(20);
35 obj1.print();
36 return 0;
37 }
Output: x = 10 y = 0
When we do not return an object by reference, a temporary object is created (which contains copy of the original object)and returned. In question 3, setX() modifies obj1, but returns a different object because return by value is used. So setY() modifies the temporary object.
Question 4
1 #include<iostream>
2 using namespace std;
3
4 class Test
5 {
6 private:
7 int x;
8 int y;
9 public:
10 Test(int x = 0, int y = 0)
11 {
12 this->x = x;
13 this->y = y;
14 }
15 void setX(int a)
16 {
17 x = a;
18 }
19 void setY(int b)
20 {
21 y = b;
22 }
23 void destroy()
24 {
25 delete this;
26 }
27 void print()
28 {
29 cout << "x = " << x << " y = " << y << endl;
30 }
31 };
32
33 int main()
34 {
35 Test obj;
36 obj.destroy();
37 obj.print();
38 return 0;
39 }
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
转载请注明:http://www.cnblogs.com/iloveyouforever/
2013-11-26 09:26:31
'this' pointer in C++的更多相关文章
- 苹果手机不支持click文字 需要添加 cursor:pointer 才能 识别可以点击
给一个div 绑定一个 click事件, 苹果手机会识别不了,必须添加一个 cursor:pointer 才能 识别可以点击.安卓正常识别.
- [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
A linked list is given such that each node contains an additional random pointer which could point t ...
- Pointer's NULL And 0
问题起源 在使用Qt框架的时候, 经常发现一些构造函数 *parent = 0 这样的代码. 时间长了, 就觉的疑惑了. 一个指针不是等于NULL吗? 这样写, 行得通吗? 自己测试一下就可以了. 测 ...
- C++中Reference与Pointer的不同
Reference与Pointer中直接存储的都是变量的地址, 它们唯一的不同是前者的存储的地址值是只读的, 而后者可以修改. 也就是说Reference不支持以下操作: *a = b 其他语言, 如 ...
- LeetCode——Copy List with Random Pointer(带random引用的单链表深拷贝)
问题: A linked list is given such that each node contains an additional random pointer which could poi ...
- Leetcode Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point t ...
- 移动端/H5关于cursor:pointer导致的问题
cursor属性规定要显示的光标的类型(形状),该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状(不过 CSS2.1 没有定义由哪个边界确定这个范围). 不过,这个属性用在PC端没有任何问题 ...
- 关于编译报错“dereferencing pointer to incomplete type...
今天同事问了我一个问题,他make的时候报错,“第201行:dereferencing pointer to incomplete type”,我随即查阅了很多资料,也没看出个所以然.最后问题得到了解 ...
- pointer to function
指针.函数.数字.结构体.指针函数.函数指针 初学不好区分,做点儿实验来有效区分一下,以下代码采用dev-C++平台测试 //pointer to fucntion 函数功能是 基地址加偏移量得到偏移 ...
- TObject、Pointer、Interface的转换
unit Unit4; )); )); )); //将Obj转为接口 //LInf1 := ITest(Pointer(LObj1)); //无法转换了,丢失了接口信息 ...
随机推荐
- mysql登录遇到ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
执行mysql -uroot -p,出现如下问题 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using pass ...
- for和while的区别及使用
for for的定义,()内的三段表达式,除了中间的必须产生布尔型,并未对其余两段有所限制,只要是表达式就可以了. //递增和递减 for(int i = 0;i < 100;i++) for ...
- redis 内存划分
1.数据:作为数据库,数据是最主要的部分,这部分占用的内存会被统计在used_memory中 2.进程内存:redis主进程本身运行需要占用的内存,这部分内存会被统计在used_memory_rss中 ...
- 《Python语言程序设计》【第1周】Python基本语法元素
实例:温度转化 #TempConvert.py 单行注释 ''' TemConvert.py ''' # 多行注释 TempStr = input("请输入带有符号的温度值: ") ...
- vue自定义指令实例使用(实例说明自定义指令的作用)
在写vue项目的时候,我们经常需要对后台返回的数据进行大量的渲染操作,其中就包含了大量的对特殊数据的进一步处理,比如说时间戳.图片地址.特殊数据显示等等特殊数据处理改进. 其实遇到这种情况,通过Vue ...
- 【故障公告】突然猛增的巨量请求冲垮一共92核CPU的k8s集群
非常抱歉,今天下午2点左右开始,博客站点突然猛增的巨量请求让k8s集群的节点服务器不堪重负,造成网站无法正常访问,由此给您带来麻烦,请您谅解. 当时k8s集群一共6台node服务器,2台32核64G, ...
- Python 中的反转字符串:reversed()、切片等
摘要:以相反的顺序反转和处理字符串可能是编程中的一项常见任务.Python 提供了一组工具和技术,可以帮助您快速有效地执行字符串反转. 本文分享自华为云社区<Python 中的反转字符串:rev ...
- R数据分析:跟随top期刊手把手教你做一个临床预测模型
临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...
- 单元测试NUnit,mock组件NSubstitute,信号量SemaphoreSlim,异步lock等例子
public class LockTest { private IDatabase _database; private readonly Random _random = new Random(); ...
- [bzoj3123]森林
首先对于询问操作可以使用可持久化线段树来维护,对于连边操作对于两颗树中选取较小的树暴力练到另一个点上,点数可以用并查集然后只修改根的点数即可. 1 #include<bits/stdc++.h& ...