c++ const对象和const函数
关于const对象和const函数的分析
基本知识:
1.如果一个成员函数不对对象的任何成员数据的进行修改(最常见的为打印成员信息的函数),那么我们可以将这个成员函数设置为const函数,以保护对象数据。如void print()const 对成员函数()后加上const限定 如果在该函数里面修改对象的成员数据,则编译器就会报错。
2.const对象的成员数据(mutable 和const_cast<>()转换例外)的值是无法修改的,而一般的非const函数可以修改对象的成员数据的值,故而 对const 对象调用非const函数就会报错(额,对非const对象调用const函数当然是ok的)
如下代码所示
#include<iostream>using namespace std;class cat{private:int age;int size;public:cat(int age=0,int size=0):age(age),size(size){}// void print()const{//const函数// cout<<"i am const"<<endl;// cout<<"age"<<age<<endl;// cout<<"size"<<size<<endl;// }void print(){cout<<"i am not const"<<endl;cout<<"age"<<age<<endl;cout<<"size"<<size<<endl;}// void show()const{//作 测试对象成员数据 用// cout<<"age"<<age<<endl;// cout<<"size"<<size<<endl;// }};int main(){const cat zjc(1,1);cat liujiao(2,2);zjc.print();//报错liujiao.print();//okreturn 0;}
const 对象zjc对于调用zjc.print()报错 如下
Member function 'print' not viable: 'this' argument has type 'const cat', but function is not marked const
而非const对象liujiao.print()就是ok的
那么如何实现 对const zjc 的调用print ???
方法一: 对print重载 由于const这个标识符作也可以为区分重载的标志(注意只有类的成员函数才有这个特殊的const限定) 故而当我们将上面的 void print()const的函数的注释撤销后
再次执行 就会有如下的执行结果
i am const
age1
size1
i am not const
age2
size2
可以看到他他对zjc 和 liujiao 分别调用了不同的print函数版本 -------这就是他们依照const实现的重载(const函数只是作为成员函数才有const ,注意友元函数和静态成员都没有没有) 当然你将 这个函数void print()抹掉 zjc 和liujiao 就调用 void print()const;这个函数
i am const
age1
size1
i am const
age2
size2
方法二: 用const_cast<>()方法将zjc转化为非const 调用 void print();
将main()函数改为如下
int main(){
const cat zjc(1,1);
cat liujiao(2,2);
(const_cast<cat&>(zjc)).print();// 注意对zjc加()和在cat后加上引用
liujiao.print();//ok
return 0;
}
输出://发现他们都可以调用void print();
i am not const
age1
size1
i am not const
age2
size2
注意 const_cast传递的是一个自身的引用值 也就是说 他在const_cast<>()转化后再调用void print();是可以改变自己的成员数据
测试 在void print();函数的第一句将上 age = 1000; 再在main的最后调用zjc.show() 测试值是否发生改变
输出:结论const_cast<>转化后传入非const函数 可以改变const对象的值
i am not const
age1000
size1
i am not const
age1000
size2
age1000 //可以发现const zjc的age已经被修改
size1
第一次写博客,有点小紧张~~~希望得到大家的支持(当然刚写博客才发现这个blog的编辑页面有点儿~~~~~下次改进!)
c++ const对象和const函数相关推荐
- C++ const对象与非const对象的相互调用、const成员函数与非const成员函数的相互调用
1)const对象可以调用非const成员函数吗? 答:不能.const修饰的对象实则修饰的是该对象的this指针,并且const修饰的成员不能进行修改,如果使用const调用非const成员函数,可 ...
- C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)
const关键字 const关键字 1.什么是const 2.使用原理 2.1.const全局/局部变量 2.2.cosnt修饰指针和引用 2.3.const修饰函数参数 2.4.const修饰函数返 ...
- C++之指向const对象的指针和const指针
1.指向const对象的指针 我们可以通过指针来修改其所指对象的值,但如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针也是const类型. ...
- C++指向const对象的指针和const指针
1.指向const对象的指针 我们可以通过指针来修改其所指对象的值,但如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针也是const类型. ...
- 如何区分“指向const对象的指针”和“const指针”?
const是C++中引入的一个新的关键字,它为C++编程带来了很大的方便.指向const对象的指针和const指针是两个名字很接近的概念,对于初学者来说非常容易搞混,这里对它们进行区分. 指向cons ...
- const指针与指向const对象的指针
一. 指向const对象的指针: 定义形式:const double *cptr; const限定了指针指向的对象类型,指针本身不是const类型 特征: 1.不能通过指针改变const对象的值,但是 ...
- 类和对象—对象特性—const修饰成员函数
常函数: 成员函数后加const后我们称这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键词mutable 后在常函数中依然可以修改 常对象 声明对象前加 const称该对象为常对象 ...
- const函数和const对象
const函数和const对象 const修饰函数时,表明该函数不能修改成员变量 const修饰对象时,表明该对象不能引用成员中非const的成员函数 #include <iostream> ...
- C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员
文章目录 构造函数再探 以下代码共调用多少次拷贝构造函数 委托构造函数 概念 形式 匿名对象 友元 友元的声明 友元类 令成员函数作为友元 函数重载和友元 注意 内部类 特性 类的const成员 可变 ...
最新文章
- oracle 查看表是否被锁
- 禁止word另存为,禁止图片另存为excel禁止另存为
- LINQ学习笔记(9) LINQ to Objects---查询内存中对象的集合
- Widget开发中遇到的坑
- 解决 git pull/push 每次都要输入用户名密码的问题
- 力扣654. 最大二叉树(JavaScript)
- codevs 1191 树轴染色 线段树区间定值,求和
- 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)
- vba循环通过键盘某个按键按下退出循环_[VBA]For Next与Do Loop循环
- tcp网络示例服务器端以及代码,演示
- Windows 7 纯净版各版本下载
- union myun { struct{ 	int x; 	int y; 	int z; }u; int k; }a;
- excel打开密码忘记了_Excel工作表保护密码忘记了怎么办?这一招轻松去除密码...
- 做的好不如说得好,老板为什么喜欢听过程汇报?
- 原理 CDN加速原理
- 超高分辨率大屏拼接工作站硬件选型
- Elasticsearch浅尝搜索
- 网站制作教程:PageAdmin建站系统在win2012上的安装
- 前端证券项目_富途证券WEB前端团队招募令
- 太原师范学院计算机考研资料汇总
热门文章
- 【项目】简单的图书管理系统(下)
- Ubuntu16.04 CUDA和GPU的最简最全安装方案及常见问题解决方法,GTX1080 Ti 和 RTX2080 Ti 亲测!
- 类脂主要包括_类脂主要包括哪些东西呢?
- java8 用strem流处理集合的例子 list转Set、Map
- 程序设计天梯赛L3-10 (什么逆天盲僧)
- python 获取文件时间
- govendor的安装与实践
- TV传送万用脚本//实现不能传送地图的传送!雪域、林中城,童话村、魔马区,地球本部等[附图]
- NKOJ-Unknow 监狱
- 什么是AES加密?详解AES加密算法原理流程