《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

不難看出這種方法使用範圍有限

本文僅發佈於:

微信公眾號:馬志峰的編程筆記

知乎專欄:zhuanlan.zhihu.com/mazh

推薦閱讀:

9月優秀筆記_劉菜_《焚舟紀》
這樣的讀書方法,讓你的閱讀質量提升300%
《帶我去太空-一部幻想與現實交織的宇宙飛船史》讀書筆記 ——100篇思維導圖讀書筆記之8
如何做好結構筆記 | 章魚讀書群出品
一月讀書筆記

TAG:C | 读书笔记 | 早睡早起 |