C++ 中的this指针
2016-01-21 19:41
405 查看
关于this指针tutorials是这样解释的:
Every object in C++ has access to its own address through an important pointer called this pointer. The this pointer is an implicit parameter
to all member functions. Therefore, inside a member function,
this may be used to refer to the invoking object.
Friend functions do not have a this pointer, because friends are not members of a class. Only member functions have a this pointer.
--> this就是非静态方法中的第0个隐藏参数,值为调用对象的指针。
this指针的含义及其用法:
1. this指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。
2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。
3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
4. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;
在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);
5. 由于this并不是一个常规变量,所以,不能取得this的地址。
6. 在以下场景中,经常需要显式引用this指针
(1) 为实现对象的链式引用(如例1);
(2) 为避免对同一对象进行赋值操作(如例2);
(3) 在实现一些数据结构时,如list.
7. 举例:
//例1:
//例2:
Every object in C++ has access to its own address through an important pointer called this pointer. The this pointer is an implicit parameter
to all member functions. Therefore, inside a member function,
this may be used to refer to the invoking object.
Friend functions do not have a this pointer, because friends are not members of a class. Only member functions have a this pointer.
--> this就是非静态方法中的第0个隐藏参数,值为调用对象的指针。
1. this指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。
2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。
3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
4. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;
在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);
5. 由于this并不是一个常规变量,所以,不能取得this的地址。
6. 在以下场景中,经常需要显式引用this指针
(1) 为实现对象的链式引用(如例1);
(2) 为避免对同一对象进行赋值操作(如例2);
(3) 在实现一些数据结构时,如list.
//例1:
#include <stdio.h> #include <string.h> class Person { public: typedef enum { BOY = 0, GIRL = !BOY } SexType; public: Person(char *n, int a, SexType s) { name = new char[strlen(n)+1]; //这里的 name 等价于this->name strcpy(name,n); //这里的 name 等价于this->name age = a; //这里的 age 等价于this->age sex = s; //这里的 sex 等价于this->sex } int get_age(void) const { //age++; //compile error, 因为 age等价于this->age,而 get_age又是一个const成员函数, //不能对 this指针所指向的这种对象进行修改,这也是const的一个作用。 //这样做的好处是,增加了代码的健壮性。 return age; } Person& add_age(int a) { age +=a; return *this; // 返回本对象的引用 } private: char *name; int age; SexType sex; }; void TestPerson(void) { Person ZhangSan("ZhangSan", 20, Person::BOY); printf("ZhangSan.age = %d\n", ZhangSan.get_age()); printf("ZhangSan.add_age = %d\n", ZhangSan.add_age(1).get_age()); //增加1岁的同时,可以对新的年龄直接输出; return; } int main(void) { TestPerson(); while(1); } /* result: ZhangSan.age = 20 ZhangSan.add_age = 21 */
//例2:
#include <stdio.h> class Location { int X,Y;//默认为私有的 public: void init(int x,int y) { X =x; Y = y;}; void assign(Location& pointer); int GetX(){ return X; } int GetY(){ return Y; } }; void Location::assign(Location& pointer) { if(&pointer!=this) //同一对象之间的赋值没有意义,所以要保证pointer不等于this { X=pointer.X; Y=pointer.Y; } } int main() { Location x; x.init(5,4); Location y; y.assign(x); printf("x.X = %d, x.Y = %d \n", x.GetX(), x.GetY()); printf("y.X = %d, y.Y = %d ", y.GetX(), y.GetY()); while(1); return 0; } /* result: x.X = 5, x.Y = 4 y.X = 5, y.Y = 4 */
相关文章推荐
- C++:继承1(矩形右上角坐标)
- 八皇后问题-C语言
- C++:类模板2(多个数中的最大数)
- C++:类模板1(2个数的大数)
- 快速排序的插排随机主元三数取中优化C语言实现
- C++学习之继承篇(多继承与多重继承)
- C语言积累2
- C++学习 【3.3】 程序设计初步--选择结构和if语句
- C++学习 【3.4】 程序设计初步--循环结构和循环语句
- c++静态成员函数和静态变量
- C语言编译执行过程详解
- C++外部程序修改exe文件属性信息的版本信息
- C语言基本数据类型简介
- 开发快很重要——如果只看法语或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦(Google也是这个看法)
- ubuntu_socket通信入门_sever.cpp/client.cpp_g++编译
- 【C++探索之旅】第一部分第六课:控制流程,随心所至
- 【C++探索之旅】第一部分第六课:控制流程,随心所至
- C++之路进阶——AC自动机(Keywords Search)
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
- 详解C++中对构造函数和赋值运算符的复制和移动操作