《C++ Primer》读书笔记第六章-2-返回类型 And 函数重载
2017-09-15 21:46
423 查看
笔记会持续更新,有错误的地方欢迎指正,谢谢!
返回类型为引用:
总结:
1.形参为引用–>调用函数时不用拷贝对象
2.返回为引用–>返回结果时不用拷贝对象
那么,是不是这么好用呢?你如果很注意细节的话当然是,但这个稍不注意就会出错:
解释:两处返回值都错了,返回ret肯定错,因为ret是在被调用函数中定义的,当return之后ret都被销毁了,怎么还能返回引用呢?那之前的怎么合法呢?因为人家不是自己定义啊,是主调函数传进来的。第二个同理,”empty”只是个在被调函数中临时创建的对象,return之后也是要销毁的,返回主调函数后,你所引用的对象何在?
总结:调用一个返回引用的函数得到左值(身份),其他返回类型得到右值(内容)。
所以,我们可以像使用其他左值那样来使用返回引用的函数的调用。
例子:
main的返回值:控制到了main的结尾仍无return语句,编译器隐式插入
递归:
递归是最考验你对函数调用理解的
例子:递归求阶乘
你可以用大脑CPU跑一个“5的阶乘”,有助于理解喔~
问题:为什么要重载而不是直接用另外名字的函数呢?
答案:这个主要是为了方便调用者,调用者都只要调用XX函数就好,编译器会根据传递的实参类型来推断具体是哪个函数~
main函数:不能调用自己,不能重载。
底层const重载是可行的:
这个函数很好用,但它有一个小小的不足,当它就收两个非常量时,我们希望返回的也是非常量,而它还是返回常量引用,所以我们要用const_cast写一个重载的函数:
这样OK~
返回类型
只要函数的返回类型不是void,要保证任何情况都有返回值!有返回值的函数
函数的返回类型是值类型,也就是说,返回值会被拷贝到调用点,这个函数在返回的时候会创建一个临时的对象,然后赋给调用点。 这样很浪费!我们当然可以不拷贝,怎么办呢,用引用啊~返回类型为引用:
const string &shortStr(const string &s1, const string &s2) { return s1.size() <= s2.size() ? s1 : s2; }
总结:
1.形参为引用–>调用函数时不用拷贝对象
2.返回为引用–>返回结果时不用拷贝对象
那么,是不是这么好用呢?你如果很注意细节的话当然是,但这个稍不注意就会出错:
//判断string是不是空的 const string &func() { string ret; if(!ret.empty()) return ret; else return "empty"; }
解释:两处返回值都错了,返回ret肯定错,因为ret是在被调用函数中定义的,当return之后ret都被销毁了,怎么还能返回引用呢?那之前的怎么合法呢?因为人家不是自己定义啊,是主调函数传进来的。第二个同理,”empty”只是个在被调函数中临时创建的对象,return之后也是要销毁的,返回主调函数后,你所引用的对象何在?
总结:调用一个返回引用的函数得到左值(身份),其他返回类型得到右值(内容)。
所以,我们可以像使用其他左值那样来使用返回引用的函数的调用。
例子:
int &getVal(){} int main() { getVal() = 5; //这样是合法的 return 0; }
main的返回值:控制到了main的结尾仍无return语句,编译器隐式插入
return 0;
递归:
递归是最考验你对函数调用理解的
例子:递归求阶乘
int fact(int val) { if(val > 1) { return fact(val-1) * val; } return 1; //一定要有这个触底反弹 }
你可以用大脑CPU跑一个“5的阶乘”,有助于理解喔~
返回数组指针
形如Type (*function(parameter_list))[dimension];函数返回类型是 指向大小为dimension的数组的指针。
函数重载
定义重载函数
同一作用域内的几个函数名字相同且形参列表不同的函数。只有返回类型不同就不行!!!(很实用)问题:为什么要重载而不是直接用另外名字的函数呢?
答案:这个主要是为了方便调用者,调用者都只要调用XX函数就好,编译器会根据传递的实参类型来推断具体是哪个函数~
main函数:不能调用自己,不能重载。
重载和const形参
顶层const作为形参,被重载是不行的,会被忽略,什么意思呢,看代码:int f(int a); int f(const int a); //错误,被判为重复声明,顶层const被忽略了。
底层const重载是可行的:
int f(int &a); int f(const int &a) //重载,常量引用都是底层const。 int f(int *a); int f(const int *a); //重载,指向常量的指针也是底层const。
const_cast和重载
const_cast和重载:常用const_cast修改const参数属性的性质(可在语句块中将形参强制转换为常量或非常量),将const和非const版本的重载函数关联。//返回两个string中较短的那个
const string &shortStr(const string &s1, const string &s2) { return s1.size() <= s2.size() ? s1 : s2; }
这个函数很好用,但它有一个小小的不足,当它就收两个非常量时,我们希望返回的也是非常量,而它还是返回常量引用,所以我们要用const_cast写一个重载的函数:
string &shortStr(string &s1, string &s2)//重载shortStr函数 { auto &r = shortStr(const_cast<const string>(s1),const_cast<const string>(s2));//强制转换s1和s2为const,再调用之前那个shortStr函数 return const_cast<string&>(r);//去掉常量,返回普通引用 }
这样OK~
调用重载函数
要记得避免二义性~相关文章推荐
- 《C++ Primer》读书笔记-第六章 03 返回类型和return语句
- 《C++ Primer》读书笔记-第六章 04 函数重载
- 《C++ Primer》读书笔记第六章-3-特殊特性 And 函数匹配 And 函数指针
- 《C++ Primer》读书笔记第六章-1-函数基础 And 参数传递
- c++ 函数符号重载 返回类型是否为引用问题 剖析
- 《C++ Primer》读书笔记第二章-3-处理类型 And 自定义数据结构
- 《C++ Primer》读书笔记 第14章:重载运算与类型转换
- 读书笔记:C++ primer 5th edition--chapter14.重载运算与类型转换
- 为什么函数不能根据返回类型来区分重载?
- 函数重载:仅根据函数返回值类型不能实现重载
- 《C++ Primer》读书笔记第二章-1-基本内置类型 And 变量
- IntelliSense 无法重载仅按返回类型区分的函数
- C#实现函数根据返回类型重载
- 在函数的重载中方法的返回值类型和参数的名字不参加比较
- 仅返回类型不同的函数,在C++中如何实现重载?
- 仅返回类型不同的函数,在C++中如何实现重载?
- 《C++ Primer》读书笔记-第六章 06 函数匹配
- 【C++】重载运算符号时的函数返回值类型问题
- 读书笔记《C++ Primer》第五版——第十四章 重载运算与类型转换
- 《C++ Primer》读书笔记-第六章 01 函数基础