《C++ Primer》讀書筆記-第六章 03 返回類型和return語句
聲明:
- 文中內容收集整理自《C++ Primer 中文版 (第5版)》,版權歸原書所有。
- 原書有更加詳細、精彩的釋義,請大家購買正版書籍進行學習。
- 本文僅作學習交流使用,禁止任何形式的轉載
返回一個值的方式和初始化一個變數或形參的方式完全一樣
返回值用於初始化調用點的一個臨時量,該臨時量就是函數調用的結果
不要返回局部對象的引用或指針
const string &manip() n{ n string ret; n if( !ret.empty() ) n { n return ret; n } n else n { n return "Empty"; n } n}n
上面的兩處返回都是錯誤的
- ret是局部變數,函數執行結束後就被銷毀了,因此不可以引用
- 「Empty」將用於初始化調用點的一個臨時量,該臨時量是函數調用的結果,同樣的,我們也不能引用一個臨時量
直接進行成員訪問
如果函數返回指針、引用或者類的對象,可以使用函數調用的結果訪問結果對象的成員
auto sz = shortString( s1, s2 ).size();n
- 一方面和調用運算符的優先順序和結合律有關係
- 另一方面應該和臨時量也有點關係,我的理解是在對臨時量進行成員訪問,正確嗎?
引用返回左值
如果函數返回的是引用類型的對象,可以直接對函數調用的結果進行賦值
getVal( s, 0 ) = A;n
實際是對引用所綁定的對象賦值
列表初始化
vector<string> process() n{ n return {"Hi", "bye"}; n}n
這個我們在刷Leetcode 01的時候用到了
main的返回值
如果main函數不寫return語句,編譯器會自動為我們加上返回0的return語句
但是建議都加上遞歸
函數調用了自身
int fac( int val ) n{ n if( val > 1 ) n { n return fac( val - 1 ) * val; n } nn reutrn 1; n}n
一定會有個if,保證有一條路徑是不包含遞歸調用的,不然就死循環了
返回數組指針
因為數組不能拷貝,所以函數不能返回數組。但可以返回數組的指針或引用
回想前面指向數組的指針的定義
int (*p2)[10] = &arr;n
聲明一個返回數組指針的函數同樣也很複雜
Type (*function(parameter_list)[dimension]n
但是形式上和定義指向數組的指針類似
int (*func(int i))[10];n
這種寫法難免有些複雜,而複雜容易產生錯誤,我們有三種方式簡化
- 類型別名
- 尾置返回類型
- decltype
類型別名
typedef int arrT[10]; narrT *func( int i );n
尾置返回類型
C++ 11新標準
auto func( int i ) -> int(*)[10];n
decltype
int odd[] = { 1, 3 }; nint even[] = { 2, 4 }; nndecltype(odd) *arrPtr( int i ) n{ n i; n return &odd; n}n
不難看出這種方法使用範圍有限
本文僅發佈於:
微信公眾號:馬志峰的編程筆記
知乎專欄:https://zhuanlan.zhihu.com/mazhifeng推薦閱讀:
※9月優秀筆記_劉菜_《焚舟紀》
※這樣的讀書方法,讓你的閱讀質量提升300%
※《帶我去太空-一部幻想與現實交織的宇宙飛船史》讀書筆記 ——100篇思維導圖讀書筆記之8
※如何做好結構筆記 | 章魚讀書群出品
※一月讀書筆記