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. 数据代理Object.defineProperty()

    数据代理: 通过一个对象代理对另一个对象中属性的操作(读/写) 数据代理 Object.defineProperty() Object.defineProperty() 方法会直接在一个对象上定义一个 ...

  2. JavaScript 对象:String & Array 及其常见应用

    String对象 split 功能:把字符串分割为字符串数组.官方文档已经描述的够清楚,不多赘述.主要说一下需要注意的情况以及应用 1.省略分割参数 var str="How are you ...

  3. 大数据SQL中的Join谓词下推,真的那么难懂?

    听到谓词下推这个词,是不是觉得很高大上,找点资料看了半天才能搞懂概念和思想,借这个机会好好学习一下吧. 引用范欣欣大佬的博客中写道,以前经常满大街听到谓词下推,然而对谓词下推却总感觉懵懵懂懂,并不明白 ...

  4. initNativeTransServiceId . ntrans:object componentId :-368613127 微信小程序

    二维码打开的页面是否存在 注意:体验版二维码默认路径是 pages/index/index 我的因为分包的原因调整了首页路径 所以路径是pages/tabBar/search/search 如果不是这 ...

  5. CSS 脉冲和火箭动画特效

    CSS脉冲和火箭动画特效 <!DOCTYPE html> <html lang="en"> <head> <meta charset=

  6. 2020 天翼杯 部分wp

    天翼杯 呜呜呜呜 是我太菜了 Web APItest 源码 const express = require("express"); const cors = require(&qu ...

  7. IDEA安装热部署插件JRebel

    首先说下热部署是什么意思吧,简单了说就是在我们对代码进行更改之后,不需要重启项目,重新编译一下就可以直接运行最新的代码的部署方式.既然是部署方式,项目启动部署的时候当然就会和正常情况下不一样啦~ JR ...

  8. 【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)

    问题描述 PowerShell 脚本调用Azure REST API, 但是所有的API都需要进行权限验证.要在请求的Header部分带上Authorization参数,并用来对List Resour ...

  9. vue如何写组件(script标签引入的方式)

    很多人知道.vue结构的单文件组件形式,不过这种单文件组件的结构如果要加入到现有的jquery项目中就比较麻烦了,那如果我们又想用vue来写模板,又不想引入vue-cli管理,那该怎么来写组件呢?别着 ...

  10. React-Router基础(<HashRouter>)

    <Router>使用URL(即window.location.hash)的哈希部分来保持UI与URL同步的A. 重要说明:哈希历史记录不支持location.key或location.st ...