自引用指针this

例 3.1 this指针的引例
  1. #include<iostream.h>
  2. class A{
  3. public:
  4. A(int x1){ x=x1; }
  5. void disp(){ cout<<"x= "<<x<<endl;}
  6. private:
  7. int x;
  8. };
  9. main()
  10. {
  11. A a(1),b(2);
  12. cout<<" a: "; a.disp();
  13. cout<<" b: "; b.disp();
  14. return 0;
  15. }

程序运行的结果:

  1. a: x=1
  2. b: x=2

理解this

  • 每一个类的成员函数都有一个隐藏定义的常量指针,我们把它称为this指针。
  • this指针的类型就是成员函数所属的类的类型
  • 每当调用成员函数时,它被初始化为被调函数所在类的对象的地址。也就是自动地将对象的指针传给它。不同的对象调用同一个成员函数时,编译器将根据成员函数的this指针所指向的对象来确定应该引用哪一个对象的数据成员。
  • 在通常情况下,this指针在系统中是隐含地存在的。也可以将其显式地表示出来。
  • cout<<“x=”<<this->x<<endl;
例3.2 显示this指针的值。 (显式)
  1. #include<iostream.h>
  2. class A{
  3. public:
  4. A(int x1){ x=x1;}
  5. void disp(){cout<<"\nthis="<<this<<"when x="<<this->x;}
  6. private:
  7. int x;
  8. };
  9. main()
  10. {
  11. A a(1),b(2),c(3);
  12. a.disp();
  13. b.disp();
  14. c.disp();
  15. return 0;
  16. }
  1. this=0x0065FDF4 when x=1
  2. this=0x0065FDF0 when x=2
  3. this=0x0065FDEC when x=3
【例3.3】 分析下列程序的运行结果,说明程序中this和*this的用法
  1. #include<iostream.h>
  2. class Sample{
  3. private:
  4. int x,y;
  5. public:
  6. Sample(int i=0,int j=0)
  7. { x=i; y=j; }
  8. void copy(Sample& xy);
  9. void print()
  10. { cout<<x<<","<<y<<endl; }
  11. };
  12. void Sample::copy(Sample& xy)
  13. {
  14. if (this==&xy) return;
  15. *this=xy;
  16. }
  17. void main()
  18. {
  19. Sample p1,p2(5,6);
  20. p1.copy(p2);
  21. p1.print();
  22. }

运行结果:

  1. 5,6
例.一个使用this的类
  1. class Circle{
  2. private:
  3. double radius;
  4. public:
  5. Circle(double radius) // 参数与数据成员同名时
  6. {
  7. this->radius = radius; // 去掉 this 如何理解?
  8. } // P272.例9.5中形式参数为何取 nam ?
  9. double get_area()
  10. {
  11. return 3.14 * radius * radius;
  12. }
  13. };
  14. int main()
  15. {
  16. Circle c = Circle(1);
  17. double a = c.get_area();
  18. cout << a << endl;
  19. return 0;
  20. }

说明:

  • this指针是一个const指针,不能在程序中修改它或给它赋值。
  • this指针是一个局部数据,它的作用域仅在一个对象的内部。

(1) 隐式存在

this指针是隐式使用的,它是作为参数被传递给成员函数的。

(2)自动实现

是编译系统自动实现的,程序设计者不必人为地在形参中增加this指针,也不必将对象a的地址传给this指针。

(3) *this

表示对象当前对象本身

例如,计算Box体积的函数可以改写为return((*this).height * (*this).width * (*this).length);

C++_自引用指针this的更多相关文章

  1. 自引用指针this

    C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针,每当创建一个对象时,系统就把this指针初始化为指向该对象,即this指针的值是当前调用成员函数的对象的起始地址.每当调用一个成 ...

  2. ca71a_c++_指向函数的指针_通过指针调用函数txwtech

    /*ca71a_c++_指向函数的指针_通过指针调用函数用typedef简化函数指针的定义简化前: bool(*pf)(const string&, const string &); ...

  3. STL模板_智能指针概念

    一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一 ...

  4. C++_day06_运算符重载_智能指针

    1.只有函数运算符可以带缺省函数,其他运算符函数主要由操作符个数确定 2.解引用运算符和指针运算符 示例代码: #include <iostream> using namespace st ...

  5. C++之智能指针20170920

    /*************************************************************************************************** ...

  6. 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...

  7. Emiller's Advanced Topics In Nginx Module Development

    Emiller的Nginx模块开发指南 By Evan Miller DRAFT: August 13, 2009 (changes) 翻译:Kongch @2010年1月5日 0:04am -- 2 ...

  8. 【从零学习openCV】opecv操作像素

    1. 存取像素值 在opencv中能够直接对cv::Mat类型的图像调用at函数读取或赋值某个像素,我们用个简单的案例来说明: //在一张图像上增加椒盐噪声,image为输入图像.n为噪点个数 voi ...

  9. C++第三天学习

    回顾: 类和对象 class 类名 { public: private: 在类的类部可以访问,在类的外部不能直接访问. protected: 在类的类部可以访问,在类的外部不能直接访问,其子类可以访问 ...

随机推荐

  1. Are query string keys case sensitive?

    Are query string keys case sensitive? @gbjbaanb's answer is incorrect: The RFCs only specify the all ...

  2. Sqlmap全参数详解

    sqlmap全参数详解 sqlmap是在sql注入中非常常用的一款工具,由于其开源性,适合从个人到企业,从学习到实战,各领域各阶段的应用,我们还可以将它改造成我们自己独有的渗透利器.这款工具中,大大小 ...

  3. GPS 经纬度

      经纬度地图: http://www.gpsspg.com/maps.htm http://www.gzhatu.com/dingwei.html 经纬度格式转化 http://www.gzhatu ...

  4. 图片旋转 1. cv2.getRotationMatrix2D(获得仿射变化矩阵) 2. cv2.warpAffine(进行仿射变化)

    原文:https://www.cnblogs.com/my-love-is-python/p/10959612.html 1.rot_mat =  cv2.getRotationMatrix2D(ce ...

  5. The Art of Picking Intel Registers Intel寄存器的艺术

    https://www.swansontec.com/sregisters.html I wrote this article for an online magazine called Scene ...

  6. docker在windows下上传文件到容器

    我的系统是windows10,docker是用DockerToolbox工具安装的,安装完之后会默认挂载Windows的C:/Users目录,在docker里面对应路径是/c/Users,docker ...

  7. 办公室上网慢原因排查 有人下载东西 设置行为管理 宽带分配设置独立下行宽带 TL-WVR1200L

    办公室上网慢原因排查 有人下载东西  设置行为管理 宽带分配设置独立下行宽带

  8. java项目代码上线

    java项目代码上线   1:java项目代码上线架构图 ip地址及主机名规划 10.0.0.11 deploy 10.0.0.12 tomcat-web01 10.0.0.13 git.oldboy ...

  9. Windows上安装nodejs版本管理器nvm 安装成功之后重启终端失效

    nvm 安装成功之后重启终端失效(command not found) 安装nvm之后node不可用,“node”不是内部或外部命令,也不是可运行的程序或批处理文件(ng) 安装nvm: 下载nvm压 ...

  10. CSS清除浮动方法集合

    CSS清除浮动方法集合 一.浮动产生原因   -   TOP 一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. ...