版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/zhuyingqingfen/article/details/31751111

先明白几个概念:

1. 常对象仅仅能调用常成员函数。

2. 普通对象能够调用所有成员函数。

3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数。每次成员函数存取数据成员时,由隐含使用this指针。
4. 当一个成员函数被调用时,自己主动向它传递一个隐含的參数。该參数是一个指向这个成员函数所在的对象的指针。
5. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值。
   在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这样的对象是不可改动的(即不能对这样的对象的数据成员进行赋值操作);
6. 由于this并非一个常规变量。所以。不能取得this的地址。

如:

  

#include <iostream>

class A
{
public:
A():mValue(0)
{ }
void print()
{
std::cout<<"hello";
}
int GetValue()
{
return mValue;
}
int GetValue()const
{
return mValue;
} private:
int mValue;
}; void test(A & const a)
{ } int main()
{ const A a;//const A* const this ;
a.print(); //错误。将会提示 error C2662: “A::print”: 不能将“this”指针从“const A”转换为“A &” test(a); //error C2664: “test”: 不能将參数 1 从“const A”转换为“A &”
}

由于a是const对象。所以a仅仅能调用类A中的常成员函数。

那么为什么会提示:“不能将this指针.......”的语句呢?

由于对于c++的成员函数(当然不是静态成员函数),都会含有一个隐藏的參数,对于上例A中的int GetValue()函数,在编译后会变成:

int GetValue(A * const this);  //不能改动this变量,但能够改动this指向的内容。即:this是常量指针。

而对于int GetValue()const ,编译后是:

int GetValue(const A* const this); 

仅仅所以this指针是const类型,由于在某次调用整个过程this指向都不同意改变(原因非常easy。假设改变的话就不是这个对象调用的了)

从编译后的结果看就非常清楚了。 由于a是const,所以其this指针就相应: const A* const this ;

而print函数被编译出来后相应的是void print(A* const this); 在进行參数匹配时, 所以就会提示 “不能将“this”指针从“const A ....."

this指针的出现就解释了。所有类A的对象都是公用一套代码模版,为什么各个对象在调用成员函数的时候不会乱套。

原来C++为成员函数提供了一个名字为this的指针。这个指针称为自引用指针。

每当创建一个对象时,系统就把this指针初始化为指向该对象。每当调用一个成员函数时。系统就自己主动把this指针作为一个隐含的參数传给该函数。不同的对象调用同一个成员函数时,C++编译器将依据成员函数this指针所指向的对象来确定应该引用哪一个对象的数据成员。通常情况下。this指针是隐含存在的。也能够将其显示的表示出来(即如上例中的 this->mValue。

只是this指针仅仅能在类中使用)

还有就是  this指针是一个const指针。不能再程序中改动它或给它赋值;

c++ 常成员函数 和 常对象的更多相关文章

  1. C/C++中的常成员函数

    代码: #include <iostream> using namespace std; class A{ public: void func1(){ cout<<" ...

  2. C++(三十二) — 常对象、常成员变量、常成员函数

    常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初 ...

  3. C++类的常成员函数

    让一个成员函数带上常量性是什么意思呢?通常的答案是,一个常成员函数不会更改其class对象.这是一种平凡的表述,而编译器实现的手法也相当平凡. 任何非静态成员函数其实都被编译器隐式插入了一个指针类型的 ...

  4. C++,常成员函数

    #include <iostream> using namespace std; class Test { public: int x; int y; void const_m1() co ...

  5. C++点滴----关于类常成员函数

    关于C++中,类的常成员函数 声明样式为:   返回类型 <类标识符::>函数名称(参数表) const 一些说明: 1.const是函数声明的一部分,在函数的实现部分也需要加上const ...

  6. C++如何显式调用常成员函数

    C++的常成员函数与同名成员函数重载时,该如何显式调用常成员函数? 具体的一个小例子: #include <iostream> using namespace std; class C1 ...

  7. 【转】C++ const成员变量和成员函数(常成员函数)

    转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. co ...

  8. C++ const成员变量和成员函数(常成员函数)

    在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只 ...

  9. C++ const常量对象、常量成员函数和常引用

    01 常量对象 如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字 class CTest { public: void SetValue() {} private: int ...

随机推荐

  1. Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate';

    springboot jdbc查询使用LocalDate报:Failed to convert value of type 'java.lang.String' to required type 'j ...

  2. SpringBoot入门之基于Druid配置Mybatis多数据源

    上一篇了解了Druid进行配置连接池的监控和慢sql处理,这篇了解下使用基于基于Druid配置Mybatis多数据源.SpringBoot默认配置数据库连接信息时只需设置url等属性信息就可以了,Sp ...

  3. MyBatis——MyEclipse中使用mybatis-generator

    mybatis-generator可以根据数据库的表来生成POJO类.mapper.xml和DAO接口,用这个插件会大大地提高开发的效率.网上虽然有一些使用这个插件的教程,但我单个试了并不能成功,会出 ...

  4. SQL SERVER 数据库面试题

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       75李四     语文   ...

  5. 用JDOM解析XML文件时如何解决中文问题?如何解析?

    import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import ja ...

  6. html 颜色选择器 亲测,很好用

    @*以下 是测试html 颜色选择器的*@ @*<a href="#" mce_href="#" onclick="initColorPicke ...

  7. ssh介绍

      一.SSH概念(百度) SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH ...

  8. Android开发day-01

    http://note.youdao.com/noteshare?id=b7f0d55c1e5eab20bb47e5c58e683611

  9. 了解java虚拟机—G1回收器(9)

    G1(Garbage-First)回收器是在JDK1.7中正式使用的全新垃圾回收器,G1拥有独特的垃圾回收策略,从分代上看,G1依然属于分代垃圾回收器,它会区分年代和老年代,依然有eden和survi ...

  10. Linux常用基本命令:三剑客命令之-awk 三元表达式

    awk 3元表达式,if...else结构都可以用3元表达式改写 ghostwu@dev:~/linux/awk$ awk -v FS=":" '{ type=$3>=100 ...