【1】示例代码

用代码说事,比较靠谱。请看下例:

 #include <QDebug>
#include <QString> class Person
{
public:
Person(int nAge, QString name);
Person(int nAge = , int nSex = , QString name = "xiaoZhang"); int getAge();
int getAge() const;
QString getName();
int getSex();
int getSex() const; private:
int m_nAge;
int m_nSex;
QString m_sName;
}; Person::Person(int nAge, int nSex, QString name)
: m_nAge(nAge)
, m_nSex(nSex)
, m_sName(name)
{} Person::Person(int nAge, QString name)
{ // Person * const this;
this->m_nAge = nAge;
this->m_sName = name;
this->m_nSex = ;
} int Person::getAge()
{ // Person * const this
qDebug() << this->m_sName << "[" << this << "] call Person::getAge()";
return m_nAge; // this->m_nAge
} int Person::getAge() const
{ // const Person * const this
qDebug() << this->m_sName << "[" << this << "] call Person::getAge() const";
return m_nAge; // this->m_nAge
} QString Person::getName()
{ // Person * const this
qDebug() << this->m_sName << "[" << this << "] call Person::getName()";
return m_sName; // this->m_sName
} int Person::getSex()
{ // Person * const this
qDebug() << this->m_sName << "[" << this << "] call Person::getSex()";
return m_nSex; // this->m_nSex
} int Person::getSex() const
{ // const Person * const this
qDebug() << this->m_sName << "[" << this << "] call Person::getSex() const";
return m_nSex; // this->m_nSex
} void main()
{
const Person xiaoMing(, , "xiaoMing");
Person chenPeng(, , "chenPeng");
qDebug() << "xiaoMing :: [" << (&xiaoMing) << "]";
qDebug() << "chenPeng :: [" << (&chenPeng) << "]"; xiaoMing.getAge();
chenPeng.getAge(); // xiaoMing.getName();
// error error: C2662: “QString Person::getName(void)”: 不能将“this”指针从“const Person”转换为“Person &”
chenPeng.getName(); xiaoMing.getSex();
chenPeng.getSex(); system("pause");
} // run out:
/*
xiaoMing :: [ 0x17fdb4 ]
chenPeng :: [ 0x17fdc0 ]
"xiaoMing" [ 0x17fdb4 ] call Person::getAge() const
"chenPeng" [ 0x17fdc0 ] call Person::getAge()
"chenPeng" [ 0x17fdc0 ] call Person::getName()
"xiaoMing" [ 0x17fdb4 ] call Person::getSex() const
"chenPeng" [ 0x17fdc0 ] call Person::getSex()
请按任意键继续. . .
*/

【2】常对象调用常方法

xiaoMing属于常对象。所谓常对象,即就是被const修饰的对象。对于常对象而言,其调用的方法必须是常成员方法。

所谓常成员方法,即就是由const修饰的成员方法。

在常成员方法中,其this指针被const修饰:const Person * const this;

因此,常对象必须调用常成员方法。原因如上所述。

chenPeng属于一般对象。所谓一般对象,即就是没有被const修饰的对象。对于一般对象而言,其调用的方法可以是一般成员方法,也可以是常成员方法。

所谓一般成员方法,相对于常成员方法而言,在一般成员方法中,其this指针不被const修饰:Person * const  this;

因此,一般对象既可以调用一般成员方法,也可以调用常成员方法。原因如上所述。

【3】总结

主要理解,const修饰,即具有”只读“性。

1、在C++中,this指针被隐式地声明为: T * const this; 这也就意味着不能给this指针赋值(如果这点还不理解,请参见随笔《const关键字》)

2、在T类的const成员方法中,this指针为:const T * const this; 这也就意味着this指针所指向的这个对象是不可修改的(即不能对这个对象的数据成员进行赋值操作)。

3、若成员方法被const修饰,那么成员方法内部无法修改任何成员变量的值。

4、若对象被const修饰,那么对象的属性值也不可被修改。

5、常对象只能调用常成员方法。

6、一般对象可以调用全部成员方法。

7、当一个对象调用成员方法时,编译程序先将对象的地址赋给this指针,然后调用成员方法。每次成员方法存取数据成员时,都隐含使用this指针。

8、当一个成员方法被调用时,自动向它传递一个隐含的参数,该参数是一个调用这个成员方法的对象的指针。

9、之所以this指针被const修饰,因为在每次调用的整个过程this指向都不允许改变(原因很简单,如果改变的话就不是这个对象调用的了,后果无法预料。)

Good Good Study,Day Day Up.

顺序 选择 循环 总结

常对象与this指针的更多相关文章

  1. C++中指向对象的常指针和指向常对象的指针

    指向对象的常指针 将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初始值,不能改变. Time t1(10,12,15),t2; Time * const ptr1=&am ...

  2. this指针/常函数、常对象

    this指针引入 类中对象的成员变量和成员函数是分开存储的,sizeof(空class) = 1,另外示例中涉及到字节对齐的问题,double本身的字节为8,int为4,由于字节对齐,int也为8,所 ...

  3. c++ 常成员函数 和 常对象

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zhuyingqingfen/article/details/31751111 先明白几个概念: 1. ...

  4. C++(三十二) — 常对象、常成员变量、常成员函数

    常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初 ...

  5. C++@类对象和类指针的区别(转)

    原文地址不详 如下程序: #include <iostream> #include <string> using namespace std; class Student { ...

  6. c++中多态性、dynamic_cast、父类指针、父类对象、子类指针、子类对象

    c++多态性是依靠虚函数和父类指针指向子类对象来实现的.简单来说,父类中定义虚函数,父类指针指向子类对象,父类指针调用函数时调用的就是子类的函数. 父类没有定义虚函数,父类指针指向子类对象时,父类指针 ...

  7. C++中的常对象和常对象成员

    常对象 常对象必须在定义对象时就指定对象为常对象. 常对象中的数据成员为常变量且必须要有初始值,如 Time const t1(12,34,36); //定义t1为常对象 这样的话,在所有的场合中,对 ...

  8. C++的函数对象优于函数指针地方

    转载自:http://blog.csdn.net/huang_xw/article/details/7934156 在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等.在这里我们介绍的则 ...

  9. procedure of object 对象的函数指针

    应用:http://www.cnblogs.com/del88/p/6361117.html 有 class of object ----- 类的类型 那么自然有 方法的类型,方法的类型 分为两种: ...

随机推荐

  1. Web项目开发中常见安全问题防范

    本文章纯粹是个人收藏,其中各种也是略略了解,下面直接贴出知识点./捂脸/捂脸 计算机程序主要就是输入/输出,安全问题由此产生,凡是有输入的地方都可能带来安全风险.根据输入的数据类型,web应用主要有数 ...

  2. zabbix监控托管主机遇到问题

    昨天监控公司的托管主机时发现监控不上,回想起来其实就是个小问题,分分钟能解决的事,排错的过程才是真正耗心费神的. 监控环境: A zabbix server: 192.168.17.110 serve ...

  3. bat实现获取文件每行内容,for循环中运行多条命令

    关键词:bat,bat获取文件内容 1.获取每行内容 @echo offfor /f "delims=" %%i in (config.txt) do (echo "%% ...

  4. more 命令

    [root@localhost ~]# .txt # 按页显示文件内容,能向下翻页查看

  5. mysql批量插入数据

    建表 create table `dept`( `id` ) unsigned NOT NULL AUTO_INCREMENT, `deptno` mediumint() unsigned ', `d ...

  6. Python3学习之路~6.1 编程范式:面向过程 VS 面向对象

    编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种 ...

  7. 【剑指offer】两个链表的第一个公共结点

    一.题目: 输入两个链表,找出它们的第一个公共结点. 二.思路: 思路一:模拟数组,进行两次遍历,时间复杂度O(n2) 思路二:假定 List1长度: a+n  List2 长度:b+n, 且 a&l ...

  8. 多线程下的单例-double check

    话不多说直接上代码: public sealed class Singleton { private static Singleton _instance = null; // Creates an ...

  9. Centos7 下 yum -y install ntp 出现/var/run/yum.pid 已被锁定

    [root@localhost ~ ]# yum -y install ntp已加载插件:fastestmirror, langpacksRepodata is over 2 weeks old. I ...

  10. Linux下搭建redis服务器

    1.redis需要gcc的编译环境,在线安装gcc:#  yum install gcc-c++ 2.上传redis的压缩包到Linux系统,解压 3.进入源码目录,编译(注意要有makefile), ...