博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常对象与this指针
阅读量:5296 次
发布时间:2019-06-14

本文共 3408 字,大约阅读时间需要 11 分钟。

【1】示例代码

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

1 #include 
2 #include
3 4 class Person 5 { 6 public: 7 Person(int nAge, QString name); 8 Person(int nAge = 18, int nSex = 1, QString name = "xiaoZhang"); 9 10 int getAge();11 int getAge() const;12 QString getName();13 int getSex();14 int getSex() const;15 16 private:17 int m_nAge;18 int m_nSex;19 QString m_sName;20 };21 22 Person::Person(int nAge, int nSex, QString name)23 : m_nAge(nAge)24 , m_nSex(nSex)25 , m_sName(name)26 {}27 28 Person::Person(int nAge, QString name)29 { // Person * const this;30 this->m_nAge = nAge;31 this->m_sName = name;32 this->m_nSex = 0;33 }34 35 int Person::getAge()36 { // Person * const this37 qDebug() << this->m_sName << "[" << this << "] call Person::getAge()";38 return m_nAge; // this->m_nAge39 }40 41 int Person::getAge() const42 { // const Person * const this43 qDebug() << this->m_sName << "[" << this << "] call Person::getAge() const";44 return m_nAge; // this->m_nAge45 }46 47 QString Person::getName()48 { // Person * const this49 qDebug() << this->m_sName << "[" << this << "] call Person::getName()";50 return m_sName; // this->m_sName51 }52 53 int Person::getSex()54 { // Person * const this55 qDebug() << this->m_sName << "[" << this << "] call Person::getSex()";56 return m_nSex; // this->m_nSex57 }58 59 int Person::getSex() const60 { // const Person * const this61 qDebug() << this->m_sName << "[" << this << "] call Person::getSex() const";62 return m_nSex; // this->m_nSex63 }64 65 void main()66 {67 const Person xiaoMing(20, 1, "xiaoMing");68 Person chenPeng(22, 0, "chenPeng");69 qDebug() << "xiaoMing :: [" << (&xiaoMing) << "]";70 qDebug() << "chenPeng :: [" << (&chenPeng) << "]";71 72 xiaoMing.getAge();73 chenPeng.getAge();74 75 // xiaoMing.getName();76 // error error: C2662: “QString Person::getName(void)”: 不能将“this”指针从“const Person”转换为“Person &”77 chenPeng.getName();78 79 xiaoMing.getSex();80 chenPeng.getSex();81 82 system("pause");83 }84 85 // run out:86 /*87 xiaoMing :: [ 0x17fdb4 ]88 chenPeng :: [ 0x17fdc0 ]89 "xiaoMing" [ 0x17fdb4 ] call Person::getAge() const90 "chenPeng" [ 0x17fdc0 ] call Person::getAge()91 "chenPeng" [ 0x17fdc0 ] call Person::getName()92 "xiaoMing" [ 0x17fdb4 ] call Person::getSex() const93 "chenPeng" [ 0x17fdc0 ] call Person::getSex()94 请按任意键继续. . .95 */

【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指针赋值(如果这点还不理解,请参见随笔《》)

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.

顺序 选择 循环 总结

转载于:https://www.cnblogs.com/Braveliu/p/7449317.html

你可能感兴趣的文章
使用onclick跳转到其他页面/跳转到指定url
查看>>
【转载】测试计划模板
查看>>
pandas 修改指定列中所有内容
查看>>
ubuntu18.04 复制或剪切某文件夹下的前x个文件到另一个文件夹下
查看>>
input的value中有特殊字符
查看>>
字符串压缩
查看>>
用Lua定制Redis命令
查看>>
小程序-canvas在IOS手机层级最高无法展示问题
查看>>
「 Luogu P2285 」打鼹鼠
查看>>
lua语言入门之Sublime Text设置lua的Build System
查看>>
解决win8使用内置管理员不能打开应用商城、天气等问题
查看>>
vue.js基础
查看>>
电脑的自带图标的显示
查看>>
globalization与全球化
查看>>
[转载] redis 的两种持久化方式及原理
查看>>
关于在Idea 创建Maven项目时,无法在source文件下创建servlet文件问题解决!
查看>>
对 HTTP 304 的理解
查看>>
深入理解css中的margin属性
查看>>
C++ 删除字符串的两种实现方式
查看>>
电容选型
查看>>