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:

/*  编辑编译环境:Dev-C++ 4.9.9.2  */
/*  file: person.cpp */

#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:

/*  编辑编译环境:Dev-C++ 4.9.9.2  */
/* file: location.cpp */

#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++中this指针相关推荐

  1. java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  2. 【Smart_Point】C/C++ 中共享指针 shared_ptr

    1. 共享指针 shared_ptr 目录 1. 共享指针 shared_ptr 1.1 共享指针解决的问题? 1.2 创建 shared_ptr 对象 1.3 分离关联的原始指针 1.4 自定义删除 ...

  3. 【Smart_Point】C/C++ 中独占指针unique_ptr

    1. 独占指针unique_ptr 目录 1. 独占指针unique_ptr 1.1 unique_ptr含义 1.2 C++11特性 1.3 C++14特性 1.1 unique_ptr含义 uni ...

  4. 【Smart_Point】C/C++ 中智能指针

    C++11智能指针 目录 C++11智能指针 1.1 C++11智能指针介绍 1.2 为什么要使用智能指针 1.2.1 auto_ptr(C++98的方案,C++11已经抛弃)采用所有权模式. 1.2 ...

  5. 某内存池中的指针用法

    内存池实现有许多种,各有不同的优缺点. 这里不是主要说内存池,只是觉得这个内存池中的指针用得很飘逸! template <class T,int AllocSize = 50> class ...

  6. c语言中程序偏离,C语言中的指针加减偏移量

    首先看一段程序: #include int main() { int a[5] = {1, 2, 3, 4, 5}; int* p = (int*)(&a + 1); printf(" ...

  7. 各种语言中对指针的叫法

    如果没有指针,就无法构造正统的数据结构, 因此,比较成熟的.正统的编程语言,必定会存在指针3. 3以前, FORTRAN . COBOL 和BASIC 中 都没有指针,但是在 fortran90.Vi ...

  8. 浅谈C中的指针和数组(一)

    本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...

  9. C++中的指针与饮用

    C++中的指针与引用其实是一样的.从编译器的反汇编源代码可以看出,引用和指针编译器的实现都是一样的.但是在用高级语言编程时的理解是不一样的. 引用可以看作是对象的一个手柄并且是于具体的数据绑定的操作这 ...

  10. 【转】C++中this指针的用法详解

    1.this指针的用处 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象 ...

最新文章

  1. php中mysql_PHP中MySQL操作
  2. 《java第二次实验》
  3. RabbitMQ的消费限流
  4. 009_Spring Data JPA一对一关系
  5. 春色满园关不住,带你体验阿里云 Knative
  6. ssl1203-书的复制【dp】
  7. 使用find 命令执行命令 -exec
  8. 解析C#中is和as操作符的用法
  9. 关于表空间、Schema和用户
  10. configure make make install in linux
  11. 2. sales quote merge before
  12. 小学计算机老师师德师风演讲稿,2015年小学教师师德师风演讲稿
  13. 兼容IE8以下,获取className节点的元素(document.getElementsByClassName()兼容写法)。
  14. Nyoj Fire Station
  15. USBCAN分析仪的配套CAN和CANFD综合测试软件LKMaster软件解决工程师CAN总线测试难题
  16. 8款微信公众号编辑器,哪个最好用?
  17. win10桌面管理文件收纳_放心的电脑桌面收纳工具必备,电脑桌面win10应用商店
  18. c语言 项目 轮子,程序员们为什么热衷于发明轮子?
  19. 《HarmonyOS开发 - 小凌派-RK2206开发笔记》第2章 源码编译与固件下载
  20. Implicit Neural Representations with Periodic Activation Functions

热门文章

  1. sublime text3找到定义_决策易aPaaS,一款非技术人员也能使用的自定义开发神器
  2. matlab在二值图像上画曲线_数字图像处理:Image Printing Program Based on Halftoning
  3. access的papersize命令_如何在报表中使用自定义尺寸的纸张
  4. java获取动态输入_java-如何在Spring中以bean形式接收动态生成的输入值
  5. 父html向子html传递参数,子父组件之间传值.html
  6. Web开发:布局视口、视觉视口、理想视口
  7. 创建用户, 使用crontab定时运行程序
  8. WPF 引用 ttf文件
  9. [数据库事务与锁]详解四: 数据库的锁机制
  10. C#打印代码运行时间