关于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函数相关推荐

  1. C++ const对象与非const对象的相互调用、const成员函数与非const成员函数的相互调用

    1)const对象可以调用非const成员函数吗? 答:不能.const修饰的对象实则修饰的是该对象的this指针,并且const修饰的成员不能进行修改,如果使用const调用非const成员函数,可 ...

  2. C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)

    const关键字 const关键字 1.什么是const 2.使用原理 2.1.const全局/局部变量 2.2.cosnt修饰指针和引用 2.3.const修饰函数参数 2.4.const修饰函数返 ...

  3. C++之指向const对象的指针和const指针

    1.指向const对象的指针 我们可以通过指针来修改其所指对象的值,但如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针也是const类型. ...

  4. C++指向const对象的指针和const指针

    1.指向const对象的指针 我们可以通过指针来修改其所指对象的值,但如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针也是const类型. ...

  5. 如何区分“指向const对象的指针”和“const指针”?

    const是C++中引入的一个新的关键字,它为C++编程带来了很大的方便.指向const对象的指针和const指针是两个名字很接近的概念,对于初学者来说非常容易搞混,这里对它们进行区分. 指向cons ...

  6. const指针与指向const对象的指针

    一. 指向const对象的指针: 定义形式:const double *cptr; const限定了指针指向的对象类型,指针本身不是const类型 特征: 1.不能通过指针改变const对象的值,但是 ...

  7. 类和对象—对象特性—const修饰成员函数

    常函数: 成员函数后加const后我们称这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键词mutable 后在常函数中依然可以修改 常对象 声明对象前加 const称该对象为常对象 ...

  8. const函数和const对象

    const函数和const对象 const修饰函数时,表明该函数不能修改成员变量 const修饰对象时,表明该对象不能引用成员中非const的成员函数 #include <iostream> ...

  9. C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员

    文章目录 构造函数再探 以下代码共调用多少次拷贝构造函数 委托构造函数 概念 形式 匿名对象 友元 友元的声明 友元类 令成员函数作为友元 函数重载和友元 注意 内部类 特性 类的const成员 可变 ...

最新文章

  1. oracle 查看表是否被锁
  2. 禁止word另存为,禁止图片另存为excel禁止另存为
  3. LINQ学习笔记(9) LINQ to Objects---查询内存中对象的集合
  4. Widget开发中遇到的坑
  5. 解决 git pull/push 每次都要输入用户名密码的问题
  6. 力扣654. 最大二叉树(JavaScript)
  7. codevs 1191 树轴染色 线段树区间定值,求和
  8. 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)
  9. vba循环通过键盘某个按键按下退出循环_[VBA]For Next与Do Loop循环
  10. tcp网络示例服务器端以及代码,演示
  11. Windows 7 纯净版各版本下载
  12. union myun { struct{ int x; int y; int z; }u; int k; }a;
  13. excel打开密码忘记了_Excel工作表保护密码忘记了怎么办?这一招轻松去除密码...
  14. 做的好不如说得好,老板为什么喜欢听过程汇报?
  15. 原理 CDN加速原理
  16. 超高分辨率大屏拼接工作站硬件选型
  17. Elasticsearch浅尝搜索
  18. 网站制作教程:PageAdmin建站系统在win2012上的安装
  19. 前端证券项目_富途证券WEB前端团队招募令
  20. 太原师范学院计算机考研资料汇总

热门文章

  1. 【项目】简单的图书管理系统(下)
  2. Ubuntu16.04 CUDA和GPU的最简最全安装方案及常见问题解决方法,GTX1080 Ti 和 RTX2080 Ti 亲测!
  3. 类脂主要包括_类脂主要包括哪些东西呢?
  4. java8 用strem流处理集合的例子 list转Set、Map
  5. 程序设计天梯赛L3-10 (什么逆天盲僧)
  6. python 获取文件时间
  7. govendor的安装与实践
  8. TV传送万用脚本//实现不能传送地图的传送!雪域、林中城,童话村、魔马区,地球本部等[附图]
  9. NKOJ-Unknow 监狱
  10. 什么是AES加密?详解AES加密算法原理流程