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 
*/

转:this的用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

  10. [转]thinkphp 模板显示display和assign的用法

    thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论 ...

随机推荐

  1. 进程&信号&管道实践学习记录

    程序分析 exec1.c & exect2.c & exect3.c 程序代码 (以exect1.c为例,其他两个结构类似) #include <stdio.h> #inc ...

  2. 信息安全系统设计第二次&第四次实验

    实验二 固件设计  实验步骤: 环境配置如同实验一,承接实验一. 1.在虚拟机中编译代码.对于多线程相关的代码,编译时需要加-lpthread 的库. 2.下载调试在超级终端中运行可执行文件 pthr ...

  3. IOS开发之—— 客服QQ(调用qq网页聊天),客服热线(拨打电话)

    @property (nonatomic,strong) UIButton *but;@property (nonatomic,strong) UIButton *but1;@property (st ...

  4. NHibernate扫盲

    NHibernate中Get和Load的区别 (1) get()采用立即加载方式,而load()采用延迟加载; get()方法执行的时候,会立即向数据库发出查询语句, 而load()方法返回的是一个代 ...

  5. JAVA并发的性能调整

    1.互斥技术 synchronized Lock Atomic 性能比较Atomic >  Lock  > synchronized,当然这不是绝对的.当线程数比较少时,synchroni ...

  6. 大型网站系统架构实践(四)http层负载均衡之haproxy实践篇(一)

    方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个haproxy服务,两个web服务 haproxy:192 ...

  7. Git代码管理心得

    一.概述: 这次按照要求进行了看似复杂,实则非常复杂并且麻烦(网上教程众多且啰嗦)的对git使用的学习,从星期六晚18:48我准备这次作业开始,直到了晚上22:44才结束电脑上的操作···(导致这篇随 ...

  8. inline-block 和 float 的区别

    1.float元素会自动成为一个块元素. 2.float元素,会脱离文档流!   默认脱离文档流的元素的z-index值是比没有脱离文档流的元素高的! 3.float:没有上下哦,  上下用margi ...

  9. Qt学习思考

    对各个部件基本了解,初步理解GUI应用程序的创建 2D图形文字绘制,3D图形(openGL)等 模型/视图框架编程,处理复杂的数据 多媒体框架 数据库,xml,文件读写等 网络编程 做出比较美观的界面 ...

  10. 在 Visual Studio 2013 中创建 ASP.NET Web 项目(0):专题导航 [持续更新中]

    写在前面的话 随着 Visual Studio 2013 的正式推出,ASP.NET 和 Visual Studio Web 开发工具 也发布了各自的最新版本. 新版本在构建 One ASP.NET ...