参考: http://www.weixueyuan.net/view/6346.html

总结:

  在每一个成员函数中都包含一个常量指针,我们称其为this指针,该指针指向调用本函数的对象,其值为该对象的首地址。

  this指针出现在static成员函数中,编译出错。this指针只能用于非静态成员函数内。

在每一个成员函数中都包含一个常量指针,我们称其为this指针,该指针指向调用本函数的对象,其值为该对象的首地址。通过该指针,我们可以在成员函数的函数体内访问对象。其中this是C++的一个关键字。

例1:

  1. class book
  2. {
  3. public:
  4. book(){this->price = 0.0; this->title = NULL;}
  5. private:
  6. double price;
  7. char * title;
  8. };

如例1程序所示,该例向我们展示了this指针的使用方法。当然在我们在实际的程序设计中并不需要如此,这样写未免太麻烦了,例1只是做介绍this指针基本语法所用。在实际设计程序时只需要按照例2就行。

例2:

  1. class book
  2. {
  3. public:
  4. book(){price = 0.0; title = NULL;}
  5. private:
  6. double price;
  7. char * title;
  8. };

通常我们在设计成员函数时会将形参与成员变量设计成同一个名字,如例3所示,此时函数定义的时候price = price;这样的程序看起来总是有些别扭的。这个使用如果使用this指针则就能很明朗的进行区分两个price了。

例3:

  1. void setprice(double price)
  2. {
  3. price = price;
  4. }

例4:

  1. void setprice(double price)
  2. {
  3. this->price = price;
  4. }

如例4所示,利用this->price表明前面一个price为类中的成员变量,而后面一个price为形参中的price。this指针在此时避免命名冲突产生理解上的歧义。

例5:

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. class book
  5. {
  6. public:
  7. book(){price = 0.0; title = NULL;}
  8. void copy(book &b);
  9. private:
  10. double price;
  11. char * title;
  12. };
  13.  
  14. void book::copy(book &b)
  15. {
  16. if(this == &b)
  17. {
  18. cout<<"same object!"<<endl;
  19. return;
  20. }
  21. else
  22. {
  23. price = b.price;
  24. }
  25. }
  26.  
  27. int main()
  28. {
  29. book Alice;
  30. book Harry;
  31. Harry.copy(Alice);
  32. Harry.copy(Harry);
  33. return ;
  34. }

在本例中,我们为book类新增了一个copy函数,即将book类对象拷贝给调用copy函数的对象,在函数体中,我们用this指针先判断被拷贝的对象的引用是否是调用该函数的对象自身,如果是的话则推出函数。在主函数中Harry.copy(Harry);就是拷贝自身,这样的事情当然是我们不希望看到的,因此直接退出函数。这在程序设计过程中也是一种常用的检测手段。

this指针是常量指针,它的值是不能被修改的,一切企图修改该指针的操作如赋值、递增、递减等都是不允许的。此外this指针只非static成员函数中才是有效的,这一点在我们介绍完static成员函数后大家就会明白为何会如此了,在此处暂时只要知道这一点就可以了。

例6:

  1. class book
  2. {
  3. public:
  4. book(){price = 0.0; title = NULL;}
  5. static void setprice(double price)
  6. {
  7. this->price = price;//compile error
  8. }
  9. private:
  10. double price;
  11. char * title;
  12. };

在例6中,this指针出现在static成员函数中,编译出错。this指针只能用于非静态成员函数内。

2.15 C++常量指针this的更多相关文章

  1. C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)

    函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  2. C语言学习笔记 (001) - 常量指针与指针常量的区别(转帖)

    三个名词虽然非常绕嘴,不过说的非常准确.用中国话的语义分析就可以很方便地把三个概念区分开. 一) 常量指针. 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量 ...

  3. 【C/C++语言】指针常量与常量指针的区别

    三个名词虽然非常绕嘴,不过说的非常准确.用中国话的语义分析就可以很方便地把三个概念区分开. 一) 常量指针. 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量 ...

  4. C和指针 第三章 指针常量与常量指针

    c语言中声明常量的两种方式 const int value int const value 如果要声明常量的指针,即指向常量的指针,则可以参考上面的常量声明修改一下 const int *ptr in ...

  5. 理清C++常量指针和指针常量这团乱麻

    写在前面: 与其说C++中的常量指针和指针常量是一块很有嚼头的语法糖,不如说它是一块相当难啃的骨头.其实本来没什么,这无非是const int *p与int* const p的区别, 但一涉及到起名字 ...

  6. c语言结构体&常指针和常量指针的区别

    结构体: 关系密切但数据类型不尽相同, 常指针和常量指针的区别: char * const cp : 定义一个指向字符的指针常数,即const指针,常指针. const char* p : 定义一个指 ...

  7. c++ 指针常量,常量指针

    当const遇到指针 一般来说,const修饰指针可以分为下面的集中情况. 描述 例子 含义 备注 const在*的左边 const int *b=&a; int const *b=& ...

  8. C++中指针常量和常量指针的区别

    在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的. 本文即是简单描述指针常量和常量指针的区别. 常量指针 定义: 又叫 ...

  9. c语言 数组名是常量指针

    //数组名是常量指针 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include ...

随机推荐

  1. R语言画点状误差线

    现在项目需要R语言做几个线性拟合,画一些点图,突然需要画误差线,网上找了下,可以用代码实现..效果如下 xx1<-c(xxxxxx,xxxx,xxxxx) yy1<-c(xxxxxx,xx ...

  2. English Voice of <<Bye Bye Bye>>

    Bye Bye Bye - Lovestoned When i see you, looking back at me 当我看到你回首看我时 Watching this eye still 彼此凝视 ...

  3. (Gorails) activeStore模块,把一堆属性放在一个hash对象内。gem 'activerecord-typedstore'增强了store模块,更好用了

    https://api.rubyonrails.org/classes/ActiveRecord/Store.html https://gorails.com/episodes/preferences ...

  4. android--------自定义控件 之 基本流程篇

    在我们平常的Android开发中经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件 自定义控件可以设计出很多你想要的功能和模块,在开发中是很重要的 ...

  5. Confluence 6 从一个模板中创建一个空间

    Confluence 已经存储了一系列的模板,这些模板被称为 空间蓝图(space blueprints),这模板具有一些自定义的主页,边栏或者可能有蓝图页面或一些示例内容来帮助你开始使用 Confl ...

  6. 代码版本控制[version control]之Git

    如何多人协同开发同一个项目? 使用代码版本控制[version control]软件, 目前市面上比较流行的代码版本控制器有: git,svn,csv 1. 使用git管理代码版本 本项目使用git管 ...

  7. 安装sql 2008步骤以及所遇到的问题

    下载网址:http://www.xiazaiba.com/html/4610.html 安装步骤: 1.  在Windows7操作系统系,启动Microsoft SQL 2008安装程序后,系统兼容性 ...

  8. bootstrap table导出功能无效报错Uncaught INVALID_CHARACTER_ERR: DOM Exception 5和导出中文乱码问题

    由于表格数据中含有中文导致的,在网页的开发者选项中报一个 Uncaught INVALID_CHARACTER_ERR: DOM Exception 5 问题.这个问题是由于BootStrap tab ...

  9. 码云插件Gitee:Couldn't get the list of Gitee repositories

    20:02 Couldn't get the list of Gitee repositories Can't get available repositories Not Found

  10. hibernate建表默认为UTF-8编码

    一.问题: hibernate自动建表的编码应该是数据默认的编码格式,一般也不是utf-8.所以想要建表默认的编码是UTF-8,应该怎么做呢? 二.解决方法: 拿mysql举例: (一).修改hibe ...