【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. Java 第二次测试总结

    Java 第二次测试总结 1. 相关知识点总结 Java测试题循环与递归知识点 补充知识点: for循环语句:for(表达式1:表达式2:表达式3)表达式一负责完成变量的初始化!表达式2是值为bool ...

  2. .net core开发工具与SDK

    一.开发工具 开发工具使用Visual Studio 2017 下载官网:https://visualstudio.microsoft.com/zh-hans/vs/ 相关的安装已经有很多文章介绍过, ...

  3. Python 字符串常用方法总结

    明确:对字符串的操作方法都不会改变原来字符串的值 1,去掉空格和特殊符号 name.strip()  去掉空格和换行符 name.strip('xx')  去掉某个字符串 name.lstrip()  ...

  4. 让对象支持with语句

    一.with语句的好处 with语句的好处在于,它可以自动帮我们释放上下文,就比如文件句柄的操作, 如果你不使用with语句操作,你要先open一个文件句柄,使用完毕后要close这个文件句柄, 而使 ...

  5. mysql 内置功能目录

    mysql 内置功能 视图介绍 mysql 内置功能 视图 使用 mysql 内置功能 触发器介绍 mysql 内置功能 触发器 实验 mysql 内置功能 事务 介绍 mysql 内置功能 存储过程 ...

  6. Linux 磁盘空间大小统计du命令常见使用方法

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/hongweigg/article/details/37692057 在 Linux下,能够对某个文件 ...

  7. 如何卸载VMware虚拟机?

    如何卸载VMware虚拟机? 1.windows + R  打开>运行-->regedit(打开编辑注册表)-->找到HKEY_LOCAL_MACHINE-->Software ...

  8. 【leetcode】部分思路整理

    题目: 求一个树的最小深度. 思路: 思路一:递归     若为空树返回0:     若左子树为空,则返回右子树的最小深度+1:(加1是因为要加上根这一层,下同)     若右子树为空,则返回左子树的 ...

  9. 使用autoconf与automake自动生成MakeFile文件

    automake主要通过编辑Makefile.am来控制它的行为,下面就常用的三个Makefile.am配置做出说明. 1.1. autotools的工作原理 autotools最终是为了生成Make ...

  10. 使用Python自带difflib模块进行文件内容差异对比

    difflib_text.py #!/usr/bin/python import difflib import sys try: textfile1=sys.argv[1] textfile2=sys ...