常对象与this指针
【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指针的更多相关文章
- C++中指向对象的常指针和指向常对象的指针
指向对象的常指针 将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初始值,不能改变. Time t1(10,12,15),t2; Time * const ptr1=&am ...
- this指针/常函数、常对象
this指针引入 类中对象的成员变量和成员函数是分开存储的,sizeof(空class) = 1,另外示例中涉及到字节对齐的问题,double本身的字节为8,int为4,由于字节对齐,int也为8,所 ...
- c++ 常成员函数 和 常对象
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zhuyingqingfen/article/details/31751111 先明白几个概念: 1. ...
- C++(三十二) — 常对象、常成员变量、常成员函数
常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初 ...
- C++@类对象和类指针的区别(转)
原文地址不详 如下程序: #include <iostream> #include <string> using namespace std; class Student { ...
- c++中多态性、dynamic_cast、父类指针、父类对象、子类指针、子类对象
c++多态性是依靠虚函数和父类指针指向子类对象来实现的.简单来说,父类中定义虚函数,父类指针指向子类对象,父类指针调用函数时调用的就是子类的函数. 父类没有定义虚函数,父类指针指向子类对象时,父类指针 ...
- C++中的常对象和常对象成员
常对象 常对象必须在定义对象时就指定对象为常对象. 常对象中的数据成员为常变量且必须要有初始值,如 Time const t1(12,34,36); //定义t1为常对象 这样的话,在所有的场合中,对 ...
- C++的函数对象优于函数指针地方
转载自:http://blog.csdn.net/huang_xw/article/details/7934156 在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等.在这里我们介绍的则 ...
- procedure of object 对象的函数指针
应用:http://www.cnblogs.com/del88/p/6361117.html 有 class of object ----- 类的类型 那么自然有 方法的类型,方法的类型 分为两种: ...
随机推荐
- sqlserver配置允许快照隔离
ALTER DATABASE TustenaOS SET ALLOW_SNAPSHOT_ISOLATION ON
- 01.jupyter环境安装
jupyter notebook环境安装 一.什么是Jupyter Notebook? 1. 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序.其可被应用于全过程计算:开发.文 ...
- webpack安装与配置初学者踩坑篇
webpack是基于nodejs开发出来的前端工具 webpack可以处理js文件的依赖关系,webpack能够处理js的兼容问题,把高级浏览器不识别的语法转换成浏览器正常识别的语法 (jnlp是基于 ...
- C++的类大小
有以下C++类 #pragma pack(push) #pragma pack(1) class task /*:public OSThread*/{ //public: // void Entry( ...
- what' the python之面向对象(进阶)
面向对象的知识点补充(进阶版) classmethod和staticmethod:这两个函数的用途就是可以不用实例化对象就可以调用方法 class Classmethod_Demo(): role = ...
- redis.conf密码设置的问题
requirepass是终端客户端登录需要的密码,配置在服务端 masterauth是从服务器端登录master端需要的密码,配置在从服务端
- nginx_tcp模块集成到openresty(安装ngx_tcp_lua_module模块)
git地址:https://github.com/bigplum/nginx-tcp-lua-module openresty 本身是使用http协议进行通讯的, 但是项目中经常有要求输入是使用tcp ...
- mysql相关SQL
1.mysql分组获取最新数据 sql> select max(column_name) from table group by column_name having count(*) orde ...
- DLNg改善深层NN:第一周DL的实用层面
1.为什么正则化可以减少过拟合? //答:可以让模型参数变小,减小模型的方差. 在损失函数中加入正则项,在正则化时,如果参数lamda设置得足够大,那么就相当于权重系数W接近于0 ,就会减少很多隐藏单 ...
- wordvector to sentence vector
wordvector已经通过word2vec训练出来了,可是如何通过WV得到SV(Sentence Vector)? 思路1: 直接将句子的向量叠加取平均:效果很不好,每个词没有考虑权重,获取的向量会 ...