pppploi8's Blog

欢迎来到pppploi8的个人博客!

C++ Primer学习笔记-函数

函数这个东西还是比较常见的,各种语言里都有…本来以为C++也差不多不会有什么奇怪的…然后…果然是我太天真了么


返回引用

函数可以返回引用类型,这个时候返回值可以当作表达式左值使用…就会显得比较少见

#include <iostream>
#include <string>
using namespace std;
char &get_val(string &str,const string::size_type ix) {
    return str[ix];
}
int main(int arge,char *argv[]) {
    string text = "hello";
    cout << text << endl; //输出hello 
    get_val(text,0) = 'H';//改变了text的第一位 
    cout << text << endl;//输出Hello 
}

然而本质上阅读起来应该是 返回值为 char &类型的get_val函数,然而之前学的语言大部分都没有这种语法…然后习惯性的看成了返回值类型为char类型的&get_val函数…瞬间懵逼

如果不希望返回出来的值被修改,应当声明为 const char &get_val(…..


函数重载

函数重载我一直认为不复杂的…然后看到C++ Primer的问题后…日常懵逼Get√

首先说下简单的概念,函数只有参数表参与重载,返回值不参与。毕竟当直接调用函数不需要返回值的时候没有办法确定到底是调用那种返回值函数

本来我觉得这样就可以了…然后看到C++ Primer上这样的问题

void test(long l){
    cout << "test long" << endl; 
} 
void test(float f){
    cout << "test float" << endl;
}
int main() {
    test(3.14); 
}

请问结果是什么?

根据我多年编程经验(然而其实并没有),理所当然的认为是test float….

然后C++编译器告诉我…无法通过编译…因为不确定调用哪一个函数…

坑爹啊喂!

然后C++ Primer解释如下:

为了确定调用的函数,编译器会根据下面的划分等级排序,排序越高则越先调用,排序相同则视为具有二义性

  • 1.精准匹配。实参和形参完全相同
  • 2.通过类型提升实现的匹配。比如说从int扩展到long,不会丢失精度
  • 3.通过标准转换实现的匹配。比如说从long转换为int,可能会丢失精度
  • 4.通过类类型转换实现的匹配。

然后…3.14这个字面值常量是double类型….转换到long会丢失精度,转换到float也会丢失精度(在理论上),两者都属于第三级….所以编译器认为这个调用具有二义性,不能通过编译

后记:试了下Java也是一样的情况,果然只是我大惊小怪了,代码写的少啊还是←u← 总之留做记录看着玩儿吧