我是靠谱客的博主 感动画笔,最近开发中收集的这篇文章主要介绍【共读Primer】44.[6.2]参数传递--const形参和实参 Page190,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一般对象类型的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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部