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. robot_framewok自动化测试--(7)认识RIDE

    认识 RIDE RIDE 作为 Robot Framework 的"脸面",虽然我们已经可以拿它来创建和运行测试了,但我们对它的认识并不全面,这一小节我们将了解这个工具的使用. 1 ...

  2. 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 ...

  3. Java多线程 | 02 | 线程同步机制

    同步机制简介 ​ 线程同步机制是一套用于协调线程之间的数据访问的机制.该机制可以保障线程安全.Java平台提供的线程同步机制包括: 锁,volatile关键字,final关键字,static关键字,以 ...

  4. v-bind使用

    v-bind基本使用 动态地绑定一个或多个属性,或者绑定一个组件 prop 到表达式. 语法:v-bind:属性名 = 属性值 <!-- 绑定一个 attribute --> <im ...

  5. MnogoDB唯一索引,稀疏索引

    1,单个字段唯一索引 db.collection.createIndex({name:1},{unique:true} 2,多个字段联合索引示例 db.collection.createIndex({ ...

  6. 快速排序平均时间复杂度O(nlogn)的推导

    快速排序作为随机算法的一种,不能通过常规方法来计算时间复杂度 wiki上有三种快排平均时间复杂度的分析,本文记录了一种推导方法. 先放快速排序的伪代码,便于回顾.参考 quicksort(int L, ...

  7. 业务领先模型(Business Leadership Model; BLM)

    1.什么是业务领先模型 业务领先模型是指是一个完整的战略规划方法论.这套方法论是IBM在2003年的时候,和美国某商学院一起研发的.后来,这个方法论成为IBM公司全球从公司层面到各个业务部门共同使用的 ...

  8. 基于EPPlus和NPOI实现的Excel导入导出

    基于EPPlus和NPOI实现的Excel导入导出 CollapseNav.Net.Tool.Excel(NuGet地址) 太长不看 导入 excel 文件流将会转为 ExcelTestDto 类型的 ...

  9. jenkins-发送allure邮件测试报告

    1.安装插件 allure-jenkins-plugin  2.在全局工具配置中,配置allure命令行 3.全局工具配置中,添加JDK配置 4.配置slave节点工具(JDK+Allure)-配置在 ...

  10. dart系列之:创建Library package

    目录 简介 Library package的结构 导入library 条件导入和导出library 添加其他有效的文件 library的文档 发布到pub.dev 总结 简介 在dart系统中,有pu ...