C++ const在成员函数前后的区别

news/2024/11/29 5:50:09/

修改自https://blog.csdn.net/weixin_41232202/article/details/118973645

一句话总结:

const放在函数主要是限制类中的成员函数const放在函数是限制函数返回类型为指针时通过指针对返回值的修改


const在函数前:

const在函数前实际上是约束函数的返回的,表明返回的值不能做左值——一个占据内存中某个可识别的位置(也就是一个地址)的对象。
实际上就是防止返回值直接被赋值。但是一般的变量无法修改函数返回值,其实是为了防止函数返回类型为指针类型时,通过指针对返回值进行修改
非指针的函数返回类型前加const是没有意义的。

示例如下。特别注意,要用const int* 类型的变量接住函数的返回值,如果只用int* 类型是不行的,是因为这样就可以通过b来修改原来函数的返回值了,与用const关键字的目的冲突。

const int* add(int* a, int n)
{for(int i=0; i<n; i++)a[i]++;return a;
}int main()
{int a[] = {1,2,3};int len = sizeof(a)/sizeof(int);const int *b; // 这里必须用const int* 类型的变量接住函数的返回值b = add(a, len);for(int i=0; i<len; i++)cout << b[i] << " ";cout << endl;return 0;
}

const在函数后:

const放在函数后通常是用在类中,限制类的成员函数不能对成员变量进行修改。同时,被函数后的const修饰的成员函数也不能调用其他非const的成员函数。

示例如下,setName2函数将无法修改成员变量,下面的写法会报错。实际上在类的成员函数中,我们有许多情况不希望成员函数修改成员变量,在其后加上const可以使得程序更加的严谨,健壮性更强。

class Stu
{private:string name;int id;public:Stu(){}Stu(string name, int id){this->name = name;this->id = id;}~Stu(){}void setName(string name){this->name = name;}setName2(string name) const{this->name = name; // 会报错,无法修改成员变量name}};

http://www.ppmy.cn/news/563805.html

相关文章

React警告: Warning: Can‘t perform a React state update on an unmounted component.

React警告&#xff1a; Warning: Can’t perform a React state update on an unmounted component. 这是一个警告&#xff0c;错误原因是不能在组件销毁后设置state。 解决方法&#xff1a; 一、清除所有的定时器 componentDidMount(){let timer setInterval(()>{let {ne…

jsp a href怎么传参数?

jsp中超链接传值使用键值对格式&#xff0c;多个键值对之间用&分隔&#xff0c;即<a href"show.jsp?nametom&pass123&score78,5">连接</a>取值则使用request对象即可<%String usernamerequest.getParameter("name");String us…

快手did did_gt edid的注册过程

接口 https://gdfp.ksapisrv.com/rest/infra/gdfp/report/kuaishou/android did 是本地生成的16进制 或者 获取的 android_id did_gt 是did生成时间戳 1595073601970 public static final Random f16237a new Random(System.currentTimeMillis());public static long m19668…

在高德地图使用: AMap is not defined

高德模板原版引入&#xff1a; <script language"javascript" src"//webapi.amap.com/maps?v1.4.15&key43b2dae85b7a78ed9ff10f40427c1d8b&pluginAMap.ControlBar"></script>当时这是个坑&#xff0c;因为src里没有加上http:或https…

YAMLException: incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulate

使用hexo g出现如下错误&#xff0c;一顿排查&#xff0c;发现&#xff0c;是文章的文件名和文章的title有非法字符&#xff0c;原title为&#xff1a;ssh: connect to host github.com port 22: Connection timed out。 解决方案&#xff1a;修改名称即可。也可能是文章内部的…

DM8(达梦数据库)基于建库SQL生成ER图,基于ER图生成数据库文档

今天项目经理让我导出DM8 数据库说明文档&#xff0c;我立刻想到了数据库文档生成工具(screw-钉子)&#xff0c;我立刻添加相关maven 依赖&#xff0c;编写junit 单元代码。但是执行的结果让我很沮丧。 相关依赖和Junit 单元代码 <!-- 自动生成数据库文档--><depende…

2020第十一届蓝桥杯C/C++ 省赛A组 题解

A 624 遍历每个数&#xff0c;取余判断每一位 #include<iostream> using namespace std;int main() {int cnt0;for(int i1;i<2020;i){int tmpi;while(tmp){if(tmp%102)cnt;tmp/10;}}cout<<cnt;return 0; }B 2481215 两个循环&#xff0c;判断最大公约数是否为1…

关于new的用法: classA p = *new A;

一&#xff1a;在学习binder 的时候看到如下一段关于 class A & p *new A &#xff1b; // frameworks/native/libs/binder/static.cpp Mutex& gProcessMutex *new Mutex; sp<ProcessState> gProcess; new其实就是告诉计算机开辟一段新的空间&#xff0c;但…