【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. Git 常用命令和统计代码量

    摘要 分享Git日常操作中常用的命令,分享如何统计在项目中贡献的代码量. 下面列出Git bash常用命令. 1. git clone **(项目地址) 克隆一个git项目到本地,将git项目拉取到本 ...

  2. js判断开始时间不能小于结束时间

    function validTime(startTime,endTime){ var arr1 = startTime.split("-");       var arr2 = e ...

  3. ASCLL码中的一些小知识

    其次要记住asill值中   65是A      97是a A与a之间相隔32,用int转换后再用char转换回来. char b = s.charAt(i);为字符串转换成一个一个的.

  4. 使用RegisterNatives注冊原生代码

    在Android开发本地代码时,有两种方式.一种是使用javah生成头文件.然后编辑源码,还有一种不用生成头文件,直接编辑代码后,使用RegisterNatives方法进行注冊,以下是一个Demo: ...

  5. 要继续看Python写算法的内容请到那里去

    由于在这里发文章的时候.莫名其妙的出现公布出去的问题.客服告知是由于链接或者敏感词. 能不能告诉我哪里出了问题?我能够改动,以便再发. 可是,没有人告诉我.仅仅是告诉我不能发. 另外,能不能公布一下敏 ...

  6. 20170731 培训Bootstrap

    Bootstrap使用 涉及培训内容框架:--1 html html为标记语言,可以理解为容器,就是用来承载你想要展示到网页的内容的容器.版本也有很多,不同版本表示不同的标记的新增或者取代. Boot ...

  7. 如何在ASP.NET 网站项目中使用C# 6?

    作者:Generic链接:https://www.zhihu.com/question/48864375/answer/113316462来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  8. 自定义安装visual studio 2010开发asp.net

    VS2010的安装对于VS的安装大家肯定都熟悉,不过我在很多地方看到的是大家讲VS的全部组件都安装了,不但浪费磁盘空间,还降低了系统性能,除此之外,还有人安装了VS之后不知道顺手把MSDN安装上,害得 ...

  9. api-gateway-engine知识点(2)

    GroupVersion实现engine本地缓存 package com.inspur.cloud.apigw.engine.cache; import java.util.Map;import ja ...

  10. python-selenium无法调用浏览器的问题

    一直有这个问题 问题:selenim不能调用浏览器 File "/Users/ligaijiang/PycharmProjects/Runoob/venv/lib/python3.7/sit ...