《C++ Primer》读书笔记-第六章 03 返回类型和return语句

作者:马志峰
链接:https://zhuanlan.zhihu.com/p/23782715
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:

  • 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
  • 原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
  • 本文仅作学习交流使用,禁止任何形式的转载

返回一个值的方式和初始化一个变量或形参的方式完全一样

返回值用于初始化调用点的一个临时量,该临时量就是函数调用的结果

不要返回局部对象的引用或指针

const string &manip()  
{  
    string ret;  
    if( !ret.empty() )  
    {  
        return ret;  
    }  
    else  
    {  
        return "Empty";  
    }  
}

上面的两处返回都是错误的

  • ret是局部变量,函数执行结束后就被销毁了,因此不可以引用
  • “Empty”将用于初始化调用点的一个临时量,该临时量是函数调用的结果,同样的,我们也不能引用一个临时量

直接进行成员访问

如果函数返回指针、引用或者类的对象,可以使用函数调用的结果访问结果对象的成员

auto sz = shortString( s1, s2 ).size();
  • 一方面和调用运算符的优先级和结合律有关系
  • 另一方面应该和临时量也有点关系,我的理解是在对临时量进行成员访问,正确吗?

引用返回左值

如果函数返回的是引用类型的对象,可以直接对函数调用的结果进行赋值

getVal( s, 0 ) = 'A';

实际是对引用所绑定的对象赋值

列表初始化

vector<string> process()  
{  
    return {"Hi", "bye"};  
}

这个我们在刷Leetcode 01的时候用到了

main的返回值

如果main函数不写return语句,编译器会自动为我们加上返回0的return语句
但是建议都加上

递归

函数调用了自身

int fac( int val )  
{  
    if( val > 1 )  
    {  
        return fac( val - 1 ) * val;  
    }  

    reutrn 1;  
}

一定会有个if,保证有一条路径是不包含递归调用的,不然就死循环了

返回数组指针

因为数组不能拷贝,所以函数不能返回数组。但可以返回数组的指针或引用

回想前面指向数组的指针的定义

int (*p2)[10] = &arr;

声明一个返回数组指针的函数同样也很复杂

Type (*function(parameter_list)[dimension]

但是形式上和定义指向数组的指针类似

int (*func(int i))[10];

这种写法难免有些复杂,而复杂容易产生错误,我们有三种方式简化

  • 类型别名
  • 尾置返回类型
  • decltype

类型别名

typedef int arrT[10];  
arrT *func( int i );

尾置返回类型

C++ 11新标准

auto func( int i ) -> int(*)[10];

decltype

int odd[] = { 1, 3 };  
int even[] = { 2, 4 };  

decltype(odd) *arrPtr( int i )  
{  
    i;  
    return &odd;  
}

不难看出这种方法使用范围有限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值