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++的更多相关文章

  1. 苹果手机不支持click文字 需要添加 cursor:pointer 才能 识别可以点击

    给一个div 绑定一个 click事件,  苹果手机会识别不了,必须添加一个 cursor:pointer 才能 识别可以点击.安卓正常识别.

  2. [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表

    A linked list is given such that each node contains an additional random pointer which could point t ...

  3. Pointer's NULL And 0

    问题起源 在使用Qt框架的时候, 经常发现一些构造函数 *parent = 0 这样的代码. 时间长了, 就觉的疑惑了. 一个指针不是等于NULL吗? 这样写, 行得通吗? 自己测试一下就可以了. 测 ...

  4. C++中Reference与Pointer的不同

    Reference与Pointer中直接存储的都是变量的地址, 它们唯一的不同是前者的存储的地址值是只读的, 而后者可以修改. 也就是说Reference不支持以下操作: *a = b 其他语言, 如 ...

  5. LeetCode——Copy List with Random Pointer(带random引用的单链表深拷贝)

    问题: A linked list is given such that each node contains an additional random pointer which could poi ...

  6. Leetcode Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

  7. 移动端/H5关于cursor:pointer导致的问题

    cursor属性规定要显示的光标的类型(形状),该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状(不过 CSS2.1 没有定义由哪个边界确定这个范围). 不过,这个属性用在PC端没有任何问题 ...

  8. 关于编译报错“dereferencing pointer to incomplete type...

    今天同事问了我一个问题,他make的时候报错,“第201行:dereferencing pointer to incomplete type”,我随即查阅了很多资料,也没看出个所以然.最后问题得到了解 ...

  9. pointer to function

    指针.函数.数字.结构体.指针函数.函数指针 初学不好区分,做点儿实验来有效区分一下,以下代码采用dev-C++平台测试 //pointer to fucntion 函数功能是 基地址加偏移量得到偏移 ...

  10. TObject、Pointer、Interface的转换

    unit Unit4; ));   ));   ));   //将Obj转为接口   //LInf1 := ITest(Pointer(LObj1));       //无法转换了,丢失了接口信息   ...

随机推荐

  1. idea查看方法在哪里被调用

    方法一 选中方法名,右键选择Find Usages 方法二 选中方法快捷键ctrl + alt + h查看Hierarchy Callers

  2. restTemple发送请求、上传文件(@LoadBalanced微服务调用及url调用)

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Co ...

  3. mysql 禁止外键检查

    SET FOREIGN_KEY_CHECKS=0; SET FOREIGN_KEY_CHECKS=1; from: https://stackoverflow.com/a/15501754/80250 ...

  4. 常见yaml写法-job

    apiVersion: batch/v1 kind: Job metadata: name: job-demo spec: template: metadata: name: job-demo spe ...

  5. c++学习笔记(七)

    位运算和sizeof运算符 位运算 C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的. 位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果. ...

  6. JSRE中的多任务与多线程

    前言 ​ 这几天在爱智官网看了下JSRE其他的Api,看了一个比较有意思的模块 - 多任务模块task,大致看了下他们的接口说明和案例,感觉和多线程差不多,然后就准备去看下实现方式,找了很久没有找到源 ...

  7. CPU被挖矿,Redis竟是内鬼!

    却说这一日,Redis正如往常一般工作,不久便收到了一条SAVE命令. 虽说这Redis常被用来当做缓存,数据只存在于内存中,却也能通过SAVE命令将内存中的数据保存到磁盘文件中以便持久化存储. 只见 ...

  8. 算法题-n月后兔子数量

    有一对兔子,从出生后第5个月起每个月都生一对兔子,小兔子长到第5个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? public class test3 { public stati ...

  9. [loj3528]位移寄存器

    当$s=0$时(求最小值): 若$x_{0},x_{1},...,x_{n-1}$和$y_{0},y_{1},...,y_{n-1}$像题中所给的方式存储在$r[0][0..nk-1]$和$r[1][ ...

  10. [bzoj1046]上升序列

    以i为开头的最长上升子序列,那么就是反过来以i为结尾的最长下降子序列,预处理出来后,不断向后找到下一个数即可 1 #include<bits/stdc++.h> 2 using names ...