第24课经典问题(中)-----关于const对象的疑问
关于const对象的疑问
const关键字能否修饰类的对象?
如果可以,有什么特性?
const关键字能够修饰对象
const修饰的对象为只读对象
只读对象的成员变量不允许被改变。(对象是只读的,成员变量不允许被改变 )
只读对象是编译阶段的概念,运行时无效。
C++中的const成员函数
-const对象只能调用const的成员函数
-const成员函数中只能调用const成员函数
-const成员函数中不能直接改写成员变量的值
const成员函数的定义:
Type ClassName::function(Type p) const
类中的函数声明与实际函数定义中都必须带const关键字
类的const函数初探
#include <stdio.h> class Test
{
int mi;
public:
int mj;
Test(int i);
Test(const Test& t);
int getMi();
}; Test::Test(int i)
{
mi = i;
} Test::Test(const Test& t)
{ } int Test::getMi()
{
return mi;
} int main()
{
Test t(); return ;
}
基于该程序,做以下实验:
1)在main 函数中定义:
const Test t(1);
t.mj = 1000;
这个程序是无法编译通过的,因为t是const对象,它里面的成员变量是无法被改变的。
2)t.getMi(),用t对象调用getMi函数时,会出错。
因为t是const对象,它只能调用const的成员函数,不能调用非const成员函数。
应该将getMi改为const成员函数:
int getMi() const;
int Test::getMi() const
{
return mi;
}
3)在const成员函数内,试图改变mi的值,能编译过吗?
int Test::getMi() const
{
mi = 1000; //错,在const成员函数内,是不允许修改成员变量的值。
return mi;
}
4)此时将getMi()的const属性去掉,进行下面的操作:
Test::Test(const Test& t)
{
mi = t.getMi();
}
这样修改后能编译过吗?
编译会失败,明确告诉我们 mi = t.getMi()这个地方失败。为什么会编译失败呢?
此处的t是Test对象的引用,注意前面加上了const关键字,这意味着给t这个对象加上了只读属性。使得t这个引用所代表的对象变成了只读对象。既然是只读对象,就只能调用const成员函数。
5)下面这样的赋值可以过吗?
Test::Test(const Test& t)
{
mi = t.mi;
}
可以编过。问题:t是一个对象,mi是类的私有成员变量。前面不是说过,不能通过一个对象直接调用类的私有成员变量嘛,在这个地方为什么可以?
下篇博客将继续探讨这个问题。
第24课经典问题(中)-----关于const对象的疑问的更多相关文章
- 第24课.经典问题解析(1.析构函数的顺序;2.const修饰对象;3.成员函数,成员变量是否属于具体对象)
1.当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 单个对象 单个对象创建时构造函数的调用顺序 a.调用父类的构造函数 b.调用成员变量的构造函数(调用顺序与声明顺序相同) c.调用类自身的 ...
- (1)ES6中let,const,对象冻结,跨模块常量,新增的全局对象介绍
1.let声明变量,var声明变量,而const声明的常量 2.let与var的区别 let可以让变量长期驻扎在内存当作 let的作用域是分块[ {快1 {快2 } }每个大括号表示一个独立的块 ...
- 第12课.经典问题解析(const;指针和引用)
问题1:const什么时候为只读变量?什么时候是常量? const常量的判别准则: a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量) b.被使用其他变量初始化的c ...
- C++中加const与不加const的区别
“常量”与“只读变量”的区别. 常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它. “只读变量”则是在内存中 ...
- C++解析(13):临时对象与const对象
0.目录 1.临时对象 2.const对象 3.类成员 4.小结 1.临时对象 一个有趣的问题--下面的程序输出什么?为什么? #include <stdio.h> class Test ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- c++中的const函数
const变量的基础:(这里给出一个小例子) const *p://*p不可以改 int *const p://p不可以改 const int *const p//二者都不可以改 正文: 在C++中, ...
- 跟我一起学编程—《Scratch编程》第24课:幸运大转盘
同学你好,欢迎来到<跟我一起学编程>,我是包老师.这是<Scratch3.0编程>课程的第24课,我这节课教你做一个抽奖游戏:幸运大转盘. 学习目标: 1. 能够熟练使用造型工 ...
- c++中的 const 关键字
知识回顾:C语言中 const const 修饰的变量是 只读的,本质上还是变量:(只读变量:可以通过指针修改只读变量中的值) const 修饰的局部变量在栈上分配空间: const 修饰的全局变量在 ...
随机推荐
- Single-SPA 前端微服务化 动态路由多系统合并
每日优鲜供应链前端团队微前端改造 动态注册路由,然后根据路由判断加载子项目js资源.子项目webpack需要设置externals,然后用systemjs接管external的包加载 webpack ...
- 有史以来Mysql面试题大全详解?
1.MySQL的复制原理以及流程 根柢原理流程,3个线程以及之间的相关: 主:binlog线程——记载下悉数改动了数据库数据的语句,放进master上的binlog中: 从:io线程——在运用sta ...
- Python中xlrd和xlwt模块使用方法----》》数据库数据导出(之一)
xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. (1) 打开excel文件并获取所有sheet >>> import xlrd >>& ...
- DRF--介绍和安装
前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高.这种应用模式比较适合纯网页应用,但是当后端对接 ...
- ASP.NET开发实战——(九)ASP.NET MVC 与数据库之ORM
之前的文章中介绍了如何在ASP.NET中通过ADO.NET操作SQL Server和My SQL数据库,数据库的操作是通过SQL语句的执行来完成的,在ASP.NET中还有一个简便的方式来使用数据库,那 ...
- 【ECNU619】白网吧(差分)
点此看题面 大致题意: 给你\(n\)个区间,求最多有多少个区间重叠,以及平均每个点被多少个区间覆盖. 第一个询问 这个应该可以直接离散化+差分,即我们先把每个区间右端点加\(1\),然后对于一个离散 ...
- 洛谷 P1840 【Color the Axis_NOI导刊2011提高(05)】 题解
看了一下题解,显然在做无用功啊,而且麻烦了许多,但是这道题真心不难,显然是一个区间修改的题目,然后查询的题目 我的线段树只需要记录一个量:区间和 看了一下其他题解的pushdown函数,发现真心写的很 ...
- Hbase 多条件查询
/** * 获得相等过滤器.相当于SQL的 [字段] = [值] * @param cf 列族名 * @param col 列名 * @param val 值 * @return 过滤器 */ pub ...
- Mac终端常用快捷键
Ctrl + a 跳到行首Ctrl + e 跳到行尾Ctrl + d 删除一个字符,相当于通常的Delete键(命令行若无所有字符,则相当于exit:处理多行标准输入时也表示eof)Ctrl + h ...
- Windows重要的win键
win+↓ 当前窗口操作,多按几下就缩没了(同理,其他箭头也一样) win+e 打开此电脑 win+v 展开剪切板 win+k 访问蓝牙 win+a win10的通知 win+d (切到桌面,再用能切 ...