const成员函数和const对象
从成员函数说起
在说const成员函数之前,先说一下普通成员函数,其实每个成员函数都有一个隐形的入参:T *const this。
int getValue(T *const this)
{
return val;
}
const成员函数
声明形式是:int getValue() const;
编译器内部实现如下
int getValue(const T* const this)
{
return val;
}
表示this指针指向的内容是不可改变的,所以当试图修改val时会编译报错。
const对象
当一个对象声明成const时,表示指向它的this指针也是const的了,变成const T *this。如果此时调用一个非const成员函数,如int getValue(),而不是int getValue() const,那么相当于把const T*this赋值给T *const this,当然会报错。所以这时候要添加一个const版本的int getValue() const,编译就能通过了。
T *this = const T *this;
当然普通非const对象调用const成员函数也是可行的,反之不行。
const成员函数调用非const成员韩函数也是不可行的,相当于把 const T*this赋值给T *this,也会编译报错。
const成员函数和const对象的更多相关文章
- c++中的const参数,const变量,const指针,const对象,以及const成员函数
const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...
- 12.C++-构造函数与析构函数调用顺序,const成员函数,const对象
单个对象创建时,构造函数的调用顺序 1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数 2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同) 3. ...
- 类的const成员函数,是如何改变const对象的?
我们知道类里面的const的成员函数一般是不允许改变类对象的,但是我们知道const 类型的指针是可以强制类型转出成非const指针的,同样的道理,this指针也可以被强制类型转换 class Y{ ...
- c++ 学习之const专题之const成员函数
一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...
- C++ Const成员函数
一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象 ...
- 拷贝构造函数和const成员函数
实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip ...
- const成员函数和mutable关键字
一.const成员函数 class MyClass { public: void fun() const { } private: int m_nValue; } const成员函数内不能修改成员变量 ...
- 【C++】const成员函数
形式: 在成员函数后面加上const限定词,表示不会修改对象内容. 例如Circle类: class Circle { double r; public: Circle(double newr) { ...
- const成员函数总结
const 成员函数: 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作不论什么改变. 在设计类的时候.一个原则就是对于不改变数据成员的成员函数都要 ...
随机推荐
- [Scikit-learn] Yield miniBatch for online learning.
From: Out-of-core classification of text documents Code: """ ======================= ...
- [转]Android 应用自动更新及6.0,7.0,8.0适配安装
原贴:https://www.jianshu.com/p/ea42040c7ace 原贴:https://www.jianshu.com/p/ea42040c7ace 原贴:https://www.j ...
- 值得学习的C语言开源项目和库
收集一些C/C++相关的源码,如有更高效的库,请提醒我 补充上去 C/C++相关交流Q群 1414577 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具. ...
- Spring Cloud(5):服务路由(Zuul)
Zuul简介 所有微服务之间的调用,都应该通过服务网关进行路由,服务网关充当服务与服务之间的中介.服务网关像交通警察一样指挥交通,将用户引导到目标微服务实例.服务网关还充当着应用程序内所有微服务调用的 ...
- android之Framework问题总结:
移动开发知识体系总章(Java基础.Android.Flutter) Android Handler消息机制 . Android中为什么主线程不会因为Looper.loop里的无限循环ANR? 1.1 ...
- imregionalmax imregionalmin imextendedmax imextendedmin imhmax imhmin 函数的详解 matlab中函数
BW = imregionalmax(I): 该函数获得灰度图像 I 的局部极大值,返回值BW为和原图像大小相同的二值图像,BW中元素1对应极大值,其他元素为0 BW = imregionalmax( ...
- 对ysoserial工具及java反序列化的一个阶段性理解【未完成】
经过一段时间的琢磨与反思,以及重读了大量之前看不懂的反序列化文章,目前为止算是对java反序列化这块有了一个阶段性的小理解. 目前为止,发送的所有java反序列化的漏洞中.主要需要两个触发条件: 1. ...
- luogu P1115 最大子段和 (dp)
链接: https://www.luogu.org/problemnew/show/P1115 题面: 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一 ...
- 【AtCoder】AGC011
AGC011 A - Airport Bus 大意:有N个人,每个人只能在\([T_i,T_i +K]\)这段区间乘车,每辆车安排C人,问最少安排几辆车 直接扫,遇到一个没有车的在\(T_i +K\) ...
- PHP获取今日、昨日、本周、上周、本月、上月、本季、上季、今年、去年
//今天开始$beginToday = date('Y-m-d 00:00:00', time());//今天结束$endToday = date('Y-m-d 23:59:59', time()); ...