版权声明:本文为博主原创文章。未经博主同意不得转载。 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. [POI 2009]Lyz

    Description 题库链接 初始时滑冰俱乐部有 \(1\) 到 \(n\) 号的溜冰鞋各 \(k\) 双.已知 \(x\) 号脚的人可以穿 \(x\) 到 \(x+d\) 的溜冰鞋.有 \(m\ ...

  2. Python装饰器举例分析

    概述 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 我们要需要一个能测试函数运行时间的decorator,可以定义如 ...

  3. php 中的sprintf 坑

    先说下为什么要写这个函数的前言,这个是我在看工作中发现一处四舍五入的bug后,当时非常不理解, echo sprintf('%.2f',123.455); //123.45 echo sprintf( ...

  4. Android开发——adb连接夜神模拟器

    夜神模拟器安装完之后,打开模拟器,在cmd命令行中进入到夜神模拟器的bin目录 本来以为不支持中文的,没想到确实支持的哈哈 之后输入adb connect 就能成功连接上了 PS:在Android S ...

  5. 【Java】包,jar包的扫描

    包扫描在框架中应用很广泛,在spring中,通过给自己的类加注解的方式,利用spring的包扫描,完成依赖注入. package com.test.package_scanner.core; impo ...

  6. Linux常用基本命令:三剑客命令之-awk内置函数用法

    awk的内置函数大致可以分类为算数函数.字符串函数.时间函数.其他函数等 算数函数 最常用的算数函数有rand函数.srand函数.int函数. 可以使用rand函数生成随机数,但是使用rand函数时 ...

  7. Python shelve

    shelve模块只有一个open函数,返回类似字典的对象,可读可写; key必须为字符串,而值可以是python所支持的数据类型. import shelve f = shelve.open('SHE ...

  8. SQL Server: create table sql script

    ---摇奖observeh数据库设计 Function getSpace lottery /* -- Author:geovindu 涂聚文 -- Date: 20180427 为了自写生成代码.根据 ...

  9. 从零开始学习html(七)CSS样式基本知识

    一.内联式css样式,直接写在现有的HTML标签中 <!DOCTYPE HTML> <html> <head> <meta http-equiv=" ...

  10. 腾讯Tars环境搭建 ---- centos

    1,安装git yum install git 2,下载脚本 git clone https://github.com/tangramor/Tars_Install.git 注意:会有3个脚本,cen ...