常成员函数函数和返回值为常量的函数
常成员函数,它的形式是在成员函数后面加上const修饰,它是为了防止特定函数改变本类对象的数据成员而产生的,目的就是保护数据成员。在常成员函数中,你不能改变数据成员的值,你也不能在常成员函数中调用非常量成员函数,因为你不确定你调用的那个非常量成员函数是否改变了数据成员的值,如果改变了,那就相当于在常成员函数里改变了数据成员,与本身的const修饰相违背。(这里说明一下,没有常全局函数之说,因为常函数的设计是为了保护数据成员的,所以只能用在可以封装成对象的结构里面。)
对常成员函数的作用可谓是一目了然,很好理解,但是对返回值为常量的成员函数就不是那么好理解了。
先谈谈返回值为常量的函数的形式吧,返回值为常量的函数分为返回值为常量的成员函数和返回值为常量的全局函数,两者形式相同,用法也相同,其形式就是在函数前加const修饰。有人可能会问,返回值为常量的函数是为了什么设计的,不是所有返回值都相当于是常量的吗?
对一般的函数确实如此,但是对于重载的操作符就不一样了。请看如下代码:class constSample { public:constSample(){m_data=-1;}constSample(int data){m_data=data;}~constSample(){}int getData() const{return m_data;}constSample operator + (const constSample & lhs){m_data+=lhs.m_data;return *this;}private:int m_data; };
这里我重载的+操作符返回值没有用const修饰,也就是返回值不为常量,那么下面的代码就成立了:
int main() {constSample sample1(3);constSample sample2(3);constSample sample3(5);cout<<"运算前:"<<endl;cout<<sample1.getData()<<" "<<sample2.getData()<<" "<<sample3.getData()<<endl;sample1+sample2=sample3;cout<<"运算后:"<<endl;cout<<sample1.getData()<<" "<<sample2.getData()<<" "<<sample3.getData()<<endl;return 0; }
下面是运行结果:
运算前:
3 3 5
运算后:
6 3 5最后sample1的数据成员的值是6,而不是我们期待的5,这是因为+的优先级比=要高,所以先计算sample1+sample2的值,结果是保存到sample1里面,为5,然后进行赋值操作,将sample3的值赋给sample1,结果就是sample3的值。这里,我们看出来了+的结果被覆盖了,所以这么做毫无意义。
试想,如果你在C++中用如下代码编译能通过吗:int main() {int a=1,b=2,c=3;a+b=c;cout<<a<<" "<<b<<" "<<c<<endl;
return 0; }
结果是显然的,赋值号左边的表达式必须是可修改的左值,而我们上面自己定义的类能编译通过,而且还能得到结果,就是因为我们的返回值没有加const修饰,当加上const修饰之后,+操作符返回的*this就相当于一个常量,自然不能放在赋值号左边,编译器就会提示错误了。
总结一下,常成员函数的设计是为了保护数据成员,而返回值为常量的函数的设计是为了防止返回值作为左值时出现的不可预料的结果。这里说明一下,一般用const修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数并产生新对象的时候。
常成员函数函数和返回值为常量的函数相关推荐
- python中func函数可以没有返回值吗_python让函数不返回结果的方法
1.简单介绍print和return的区别,print仅仅是打印在控制台,而return则是将return后面的部分作为返回值:作为函数的输出,可以用变量接走,继续使用该返回值做其它事. 2.函数需要 ...
- 主函数中调用返回值为void的函数,函数的参数传递规律
参数为基本类型(int/char/-) public static void main(String[] args){ int a=0; hs(a); System.ou ...
- ostream作为函数返回值_GO语言基础函数
GO语言基础–函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数定义 Go语言中定义函数使用func关键字,具体格式如下: func 函数名(参数 ...
- python write函数参数_Python函数-函数参数、返回值
函数 1.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫 做subroutine(子过 ...
- Python技术手册 · 函数的多返回值&文件操作
目录 函数的多返回值&文件操作 函数的多返回值 多返回值返回方式 函数的传参方式(以不同的使用方式分类) 位置参数 关键字参数 缺省参数 不定长参数 匿名函数(lambda) 函数 ...
- linux 函数返回string,linux 下c函数strcmp的返回值疑问?
linux 下c函数strcmp的返回值疑问? strcmp函数解释: NAME strcmp, strncmp - compare two strings SYNOPSIS #include int ...
- 函数指针,指针函数,返回值为指针的函数
摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...
- C++中函数模板的返回值是模板类型参数的调用方法
1 函数模板 模板定义以关键字template开始,后接模板形参表,模板形参表是用尖括号扩住的一个或多个模板形参的列表,形参之间以逗号分隔.关于函数模板的详细介绍,请参考<C++中模板函数及模板 ...
- const 修饰函数参数,返回值,函数体,保护数据
一.const 介绍 1.const 定义 const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 2.const 目的 const 推出的初始目的,正是为了取代预编译指令,消除 ...
最新文章
- pandas使用dropna函数删除dataframe中所有包含缺失值的数据行(drop rows which contain missing vlaues in dataframe)
- asp.net treeview控件无刷新选择和删除节点的ajax方法
- python是c语言写的吗-python是c语言开发的吗
- Windows Server中企业证书服务的安装
- 104. Maximum Depth of Binary Tree 二叉树的最大深度
- vue 多页面多模块分模块打包 分插件安装_Vue渲染方式
- bash 字符串处理(转)
- Java中null和浮点数相乘_jvm规范之浮点数 - 你知道吗,有个数字它和自身不相等...
- Hindex--华为Hbase二级索引
- 记录wuyi公积金调用过程
- PPT创作技巧及有用素材
- Axure 9软件功能区域、界面介绍
- python循环结构语句实现_Python的循环结构
- 【Django】admin的save_modle方法重写-20220803
- 计算机网络 概述重点(全)
- Java学习笔记--Java中必记常见异常
- tf.compat.v1.nn.rnn_cell.BasicLSTMCell
- html页面散点图怎么做,11.散点图的实现.html
- 从flowable到统一流程平台
- 七日杀服务器大全最新,七日杀服务器设置 | 手游网游页游攻略大全
热门文章
- 兵棋---棋盘绘制算法(六边形阵列算法)
- 用Python画论文折线图、曲线图?几个代码模板轻松搞定!
- Android 中怎么重启APP、重启系统
- 阿里云短信服务不对个人开放?如何在阿里云市场免费购买短信服务?云市场购买到的短信服务如何使用?(以谷粒学院项目为例)
- 用java代码执行命令行并获取返回结果
- 第一章: 准备面试要知己知彼
- python能建网站吗_python适合建网站吗
- 手把手教你用python实现批量给图加水印
- python爬虫入门教程04:招聘信息爬取
- 一位大学老师感染新冠期间写的年终总结:怀疑得了新冠39次,吃黄桃罐头5次…...