零 概述
这篇文章以及它可能于未来出现的续篇,将记录我在C++学习过程中遇到的各种疑问以及相应的理解。
我学习C++尚不足两个月,现在实际上是在用java规定的风格写C++的程序,最近又开始用Qt编程,对于C++的基础语法却一直没有详细研究。平时的学习总是倾向于编程而忽视阅读经典,今天就抽出时间重读C++Primer。
一 C++中为什么要引入引用?
之前一直觉得C++的引用在功能上等价于形如Type * const ptr的指针。尽管有人解释说引用增强可读性,但是我并不认同这种主观的说法。加入引用给我一种画蛇添足之感,不过C++本来就是百足之虫,再多添一笔并无过分强烈的违和感,所以一直没有关注引用,以为引用的存在没有必要性。实际上C++可以去掉引用吗?在看到大量api中引用形参的使用远远多于指针形参,我又觉得可能并非如此。
今天读C++Primer找到了引用存在的意义。
const引用在函数形参中有唯一地位——可以允许不匹配的实参进行转换,产生临时值传入参数。
例如double refcube(const double & ra) 就允许int类型作为参数。这是一个在java中被隐藏了的语法。
引用参数实际上是基于指针的代码的另一个接口,但是它的确不可替代,在大量使用类型转换的类对象编程中引用是需要修改参数数据的函数形参的唯一选择。
二 C++中的函数重载
例1:
double cube(double x);
double cube(double & x);
这种函数重载是不允许的,因为cube(x)对于两者都适用,编译器无法做出选择。
为了避免混乱,编译器把类型引用和类型自身视作相同特征标。
例2:
long gronk(int n,float m);
double gronk(int n,float m);
这种函数重载同样不允许,尽管返回值可以变,但是特征标必须加以区分才能让编译器做出判断。
三 完全匹配允许的无关紧要转换
实参 形参
Type Type&
Type& Type
Type[] *Type
Type const Type
Type volatile Type
Type* const Type
Type* volatile Type
Type(argment-list) Type(*)(argment-list)