概述
一般对象类型的const形参
形参的顶层const将被忽略掉
为了说明这个问题我们引入两组代码来进行参照说明。
// 该参数可以传递const的实参,也可以传递非const的实参 void fcn(const int i){} // 下面这个函数编译器会认为是重复定义,原因在于忽略顶层const特性 // void fcn(int i) int main() { const int ci = 42; // 顶层const,初始化后无法改变 int i = ci; // 当进行拷贝操作是,忽略了他的顶层const属性 int * const p = &i; // const是顶层的,不能给p赋值 *p = 0; // 通过平改变对象的内容是允许的 }
在const一般对象的形参中需要掌握的特性有两种:
1. const的形参可以使用const实参或非const实参进行函数调用
2. 编译器不会将函数参数是否const的区别认定为重载函数
关于const如果不是很清晰,可以参考https://www.cnblogs.com/ChattyKu/p/9432970.html
指针及引用的const形参
形参的初始化和变量的初始化没有什么本质上的区别,只是形式的不同。
所以我们来回顾一下初始化规则:
int i = 42; const int *cp = &i; // cp不能改变i const int &r = i; // r不能改变i const int &r2 = 42; // int *p = cp; // 错误: p的类型和cp的类型不匹配 // int &r3 = r; // 错误: r3的类型和r的了性不匹配 // int &r4 = 42; // 错误:不能用字面值初始化一个非常量引用 // 在函数调用的值传递上形式如下 void reset(int *){} void reset(int &){} int i = 0; const int ci = i; string::size_type ctr = 0; reset(&i); // 调用形参类型是int*的reset函数 // reset(&ci); //错误:不能用指向const int对象的指针初始化int* reset(i); // 调用形参类型是int&的reset函数 // reset(ci); // 错误:不能吧普通引用绑定到const对象ci上 // reset(42); // 错误:不能把普通引用绑定到字面值上 // reset(ctr); // 错误:类型不匹配,ctr是无符号类型
在不需要改变值的情况下使用const,请尽可能多的使用const
转载于:https://www.cnblogs.com/ChattyKu/p/9576819.html
最后
以上就是感动画笔为你收集整理的【共读Primer】44.[6.2]参数传递--const形参和实参 Page190的全部内容,希望文章能够帮你解决【共读Primer】44.[6.2]参数传递--const形参和实参 Page190所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复