【共读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

猜你喜欢

转载自www.cnblogs.com/ChattyKu/p/9576819.html