您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer》读书笔记第六章-2-返回类型 And 函数重载

2017-09-15 21:46 423 查看
笔记会持续更新,有错误的地方欢迎指正,谢谢!

返回类型

只要函数的返回类型不是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++ c++primer 读书笔记