常对象与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 ----- 类的类型 那么自然有 方法的类型,方法的类型 分为两种: ...
随机推荐
- POJ1845 sumdiv 数论
正解:小学数学数论 解题报告: 传送门! 其实不难但我数学这个方面太菜了所以还是多写点儿博客趴QAQ 然后因为是英文的所以先翻译一下,,,? 大概就是说求AB的所有约数之和,对9901取膜 这个只需要 ...
- document的全量替换、强制创建、删除
1.document的全量替换(1)语法与创建文档是一样的,PUT /test_index/test_type/id ,如果document id不存在,那么就是创建:如果document id已经存 ...
- MongoDB与关系型数据库 区别
mysql mongodb 表 table Collection 字段 Colum Fields 行 row Document Mongo中的一些概念 ------------- ...
- HBase 的MOB压缩分区策略介绍
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zNZQhb07Nr/article/details/79832392 HBase应用场景很广泛.社区 ...
- String[]与List<String>的相互转换
String[]转List String[] arr = new String[]{"a","b","c"}; List<String ...
- PHP自动加载SPL的四种处理方式
libs目录下有3个类文件: Test.class.php <?php class Test { public function __construct() { echo "Loadi ...
- (转)spring计划任务,springMvc计划任务,Spring@Scheduled,spring定时任务
一.计划任务实现类 1.用@Component注解标识计划任务类,这样spring可以自动扫描 2.在方法中使用注解标识要执行的方法:@Scheduled(cron="*/30 * * * ...
- 2019.04.09 电商24 订单模快 ORM
前面三个模块已近结束,现在看是订单模块的.想一下淘宝上的订单,在购物车中选中,提交,跳转到订单界面. 获取传过来的信息,那也要建立一个订单表,当我支付的时候,也要获取一些数据,将这些数据放到这个表中 ...
- [LeetCode] 840. Magic Squares In Grid_Easy
A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, co ...
- CSS选择器操作大全
一,CSS选择器分类 二,选择器语法 1,基本选择器语法 选择器 类型 功能描述 * 通配选择器 选择文档中所以HTML元素 E 元素选择器 选择指定类型的HTML元素 #id ID选择器 选 ...