【1】示例代码
用代码说事,比较靠谱。请看下例:
1 #include2 #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.
顺序 选择 循环 总结