Advanced C++ --- const function

上一篇介绍了const修饰的变量或者指针的含义,这篇我们介绍const修饰的函数以及函数参数含义。

 首先我们看一个例子

class Dog{int age;string name;
public:Dog(){age = 3;name = "dummy";}void setAge(const int &a){age = a;a++;}
};int main(){Dog d;int i = 9;d.setAge(i);cout << i << endl;
}

  在上面例子中,如果setAge中参数不加上const,则可能通过该函数修改i的值,如果这不是我们想要的,那么就可以通过对参数使用const。编译的时候会报错。

const在C++中是非常常用的一个修饰,我们在合适的时候就要尽量用上这样的修饰符,可以增加代码的健壮性和可读性。

   下面我们再看一个例子,如果我们将function参数上面的引用符去掉的话,又会有什么变化呢?

class Dog{int age;string name;
public:Dog(){age = 3;name = "dummy";}void setAge(const int a){age = a;
     // compile error// a
++;}
    
    void setAge(int a){age = a;
     // compile error// a++;}
};int main(){Dog d;int i = 9;d.setAge(i);cout << i << endl;
}

  这样,自然编译成功,这里需要学习的是如果将引用去掉,那么就是值传递,i做了一个值拷贝给了这个函数,自己不会发生变化,这个C++初学者也是明白的道理。

如果我们将上面setAge函数的参数的const去掉,作为函数重载,那么编译也会错误,因为C++在重载的时候必须要有不同的参数表,而const int和int会被编译器认为是同种类型。

  返回值为const的函数:

class Dog{int age;string name;public:Dog(){age = 3; name = "dummy";}// const parametersvoid setAge(const int& a) {age = a; cout<<"const"<<endl;}void setAge(int& a) {age = a; cout<<"non-const"<<endl;}// const return value_compconst string& getName(){return name;}// const functionavoid printDogName() const {cout << "const" << endl;}void printDogName() {cout << "non-const" << endl;}
};int main(){Dog d;const string& n = d.getName();cout << n << endl;
  
  d.printDogName();

  Dog d2;
  d2.printDogName();
}

   output: dummy const non-const

  上面例子非常清楚地展示了const修饰的function的作用效果,const如果在function后面,表示该function会在该对象为const时调用。需要注意的是,如果类的成员函数修饰为const,那么该函数中只能调用const函数,也就是说,上面的const函数不能调用getName,因为getName函数不是const函数。

  如果把上面printDogName的const去除,是不是表示该函数被重载了呢?答案是肯定的,那么问题来了 ,什么时候const修饰的函数被调用,又什么时候没有const修饰的函数被调用呢?大家可以写一写,弄清楚,这里就直接公布答案了:

  当Dog为const时,const函数会被优先执行,当Dog不是const时,会优先执行非const函数(当然,前提是这两个函数都要有,如果没有函数重载,那么就会调用唯一的那个函数,不会报错)。

  刚才说了const修饰的函数的调用规则,那么function参数是否有const的调用规则如何呢?规则如下:如果传入的参数为const修饰的,那么将会调用函数参数中有const修饰的那个。其实这个简单的规则还可以细说,将会以Lvalue和Rvalue在后续的博文中继续说明。        

  

转载于:https://www.cnblogs.com/RookieCoder/p/5057174.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

slf4j、log4j日志报错排查

1、WARN Please initialize the log4j system properly 解法&#xff1a;只要在 src文件目录下建立配置文件log4j.properties即可 2、SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder" 解法&#xff1a;这是因为sl4j和log4j的不兼容导致的&#…

无刷新三级联动查询

JQuery中国省市区无刷新三级联动查询&#xff08;转&#xff09;&#xff1a;http://www.cnblogs.com/xiaoyu5062/archive/2012/07/30/2615359.html Ajax实现无刷新三联动下拉框&#xff08;转&#xff09;&#xff1a;http://singlepine.cnblogs.com/articles/257954.html js特…

java.lang.NoClassDefFoundError: org/apache/shiro/authc/AuthenticationToken

使用ieda构建web工程项目&#xff0c;启动tomcat报错&#xff1a; java.lang.NoClassDefFoundError: org/apache/shiro/authc/AuthenticationToken maven经过不断的clean&#xff0c;compile、package都没有作用&#xff0c;最后发现是因为compile后生成了jar包 于是手动在pom…

iOS屏幕尺寸和分辨率了解

1、截至目前为止&#xff0c;主流的iOS设备屏幕有以下几种&#xff1a; --------------- iPhone ---------- -------- iPad ------------ 2、iOS设备屏幕分辨率&#xff1a;&#xff08;ppi是像素密度单位【像素/英寸】&#xff0c;401ppi表示每英寸上有401个像素&#xff0…

“睡服”面试官系列第十七篇之Reflect(建议收藏学习)

目录 1. 概述 2. 静态方法 2.1Reflect.get(target, name, receiver) 2.2Reflect.set(target, name, value, receiver) 2.3Reflect.has(obj, name) 2.4Reflect.deleteProperty(obj, name) 2.5Reflect.construct(target, args) 2.6Reflect.getPrototypeOf(obj) 2.7Reflec…

java死锁检测

/*** author&#xff1a;cp* time&#xff1a;2021-2-24* Description: java死锁测试* 进程id查看命令&#xff1a;jsp 找到对应的进程id* 通过jstack 进程id 输出死锁信息** 如何定位死循环导致的其他线程阻塞等待&#xff1a;* linux下top命令查看cpu使用率较高的java进程&am…

div始终在底部

<style type"text/css">body{margin:0;padding:0; } html,body{height:100%;}div{width:100%;height:100px;background:#fc9;position:absolute;top:100%;margin-top:-100px}</style><div></div> 底部多高它的margin-top 就负多少。保证不留…

“睡服”面试官系列第十八篇之generator函数的语法(建议收藏学习)

目录 1简介 1.1基本概念 1.2yield 表达式 1.3与 Iterator 接口的关系 2. next 方法的参数 3. for...of 循环 4. Generator.prototype.throw() 5. Generator.prototype.return() 6. next()、throw()、return() 的共同点 7. yield* 表达式 8. 作为对象属性的 Generator…

微信撤回消息格式

<msg><fromusername>wxid_1zcdlm1cjhr522</fromusername><scene>0</scene><commenturl></commenturl><appmsg appid"" sdkver"0"><title>还好</title><des></des><action>…

MSSQL 2005数据库与SP4补丁安装

MSSQL 2005数据库与SP4补丁安装 Sql Server 2005 正确安装之前的win7配置&#xff1a; http://wenku.baidu.com/link?url6T3jzVnu2XY_sfqfe9ZqQ_6dUOdrZwHc83baWh6tgD2D4RBLnbFVoYn5hpq80v3G9ZmE1mQMzmSVWbm6VR26LlSGg3Pobl6B5VskugHjYF7 Sql Server 2005 的下载地址&#xff…

“睡服”面试官系列第十九篇之async函数(建议收藏学习)

目录 1. 含义 2. 基本用法 3. 语法 3.1返回 Promise 对象 3.2Promise 对象的状态变化 3.3await 命令 3.4错误处理 3.5使用注意点 4. async 函数的实现原理 5. 与其他异步处理方法的比较 6. 实例&#xff1a;按顺序完成异步操作 7. 异步遍历器 7.1异步遍历的接口 …

spring技术内幕——深入解析spring架构与设计原理

林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;说&#xff1a;“我从心底认为&#xff0c;优秀的程序员与平庸的程序员之间的区别&#xff0c;是在于认为自己的代码重要还是数据结构更加重要。平庸的程序员眼里只有代码&#xff0c;优秀的程序员则关注数据结构及之前的关…

python3 字符串方法

python3 字符串方法 1.capitalize() 将字符串的第一个字符改为大写 1 >>> si love cnblog 2 >>> s.capitalize() 3 I love cnblog 2.casefold() 将字符串所有字符改为小写 1 >>> (s.capitalize()).casefold() 2 i love cnblog 3.center(width) 将字…

重学算法第三期|数据结构与算法001

目录 强烈推荐一个数据结构可视化工具&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html&#xff0c;点击B树即可模拟B树的动态插入过程&#xff0c;非常有利于理解 1、开篇词 2、为什么要学习数据结构与算法 3、如何抓住重点&#xff0c;系统高…

部署和调优 3.4 腾讯企业邮箱免费版 未完

浏览器输入腾讯的企业邮箱官网 exmail.qq.com 点右上角的 申请开通 最下面有个 免费版 填好基本信息 根据提示验证密保邮箱 转载于:https://www.cnblogs.com/wangshaojun/p/5079304.html

前端学习(1715):前端系列javascript之页面配置

test-page.vue <template><view>test-page</view> </template><script>export default {data() {return {}},methods: {}} </script><style></style>page.json {"pages": [ //pages数组中第一项表示应用启动页&a…

03|复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

目录 为什么需要复杂度分析&#xff1f; 大 O 复杂度表示法 时间复杂度分析 几种常见时间复杂度 空间复杂度分析 为什么需要复杂度分析&#xff1f; 事后统计法&#xff1a;代码跑一遍&#xff0c;通过统计、监控&#xff0c;就能得到算法执行的时间和占用的内存大小。这种…