## 第6章 函數
### 6.2.3
當形參有頂層const時,傳給它常量對象或者非常量對象都是可以的。因此,當引用作為形參時,應盡量使用常量引用。
### 6.2.6
**initializer_list**對象中的元素永遠是常值。
### 6.3.2
調用一個返回引用的函數得到左值,其他返回類型得到右值。
- 練習6.33
```cpp
/* 文件名:ex6.33.cpp */
/* C++ Primer中文版第5版, 練習6.33 */
/* 題目要求:編寫遞歸函數,輸出vector對象的內容 */
#include <iostream>
#include <vector>
using namespace std;
using Iter = vector<int>::const_iterator;
int print_recursion(Iter beg, Iter end)
{
if (beg == end)
{
cout << "End" << endl;
return 0;
}
cout << *beg << " ";
print_recursion(++beg, end);
}
int main(void)
{
vector <int> iv{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
Iter beg = iv.cbegin(), end = iv.cend();
print_recursion(beg, end);
return 0;
}
```
### 6.3.3
尾置返回類型(trailing return type)跟在形參列表后面并以->符號開頭,而在函數名前用auto關鍵字修飾。
```cpp
auto func(int i) -> int(*)[10];//返回一個指向含有10個整型的數組的指針
```
### 6.4 函數重載
- 不允許兩個函數除了返回類型外其他所有的要素都相同。即返回類型差異不被視為重載依據。
- 當我們傳遞一個非常量對象或者指向非常量對象的指針時,編譯器會優先選用非常量版本的函數。
### 6.5.1
在給定的作用域中一個形參只能被賦予一次默認實參。換句話說,函數的后續聲明只能為之前那些沒有默認值的形參添加默認實參,而且該實參右側的所有形參必須都有默認值。
### 6.5.2 內聯函數和constexpr函數
- **constexpr函數**的返回類型及所有形參的類型都得是字面值類型,而且函數體中必須有且只有一條實際操作語句(return語句)。
- **constexpr函數**被隱式地指定為內聯函數。
- 內聯函數和constexpr函數可以在程序中多次定義,因此通常定義在頭文件中。
### 6.7 函數指針
編譯器不會將函數返回類型當成對應的指針類型處理。
- 6.7節練習
```cpp
/* 文件名:ex6.54.cpp */
/* C++ Primer中文版第5版, 6.7節練習 */
/* 題目要求: 函數指針的應用 */
#include <iostream>
#include <vector>
using namespace std;
int myAdd(int a, int b)
{
return a + b;
}
int mySub(int a, int b)
{
return a - b;
}
int myMul(int a, int b)
{
return a * b;
}
int myDiv(int a, int b)
{
//return a / b;
return b != 0 ? a / b : 0;//處理除數為0的情況
}
int main(void)
{
int Fun(int, int);
int a, b;
vector <decltype(Fun)*> vpFun;
vpFun.push_back(myAdd);
vpFun.push_back(mySub);
vpFun.push_back(myMul);
vpFun.push_back(myDiv);
cout << "Enter 2 integers, separated by space: ";
cin >> a >> b;
cout << "add: " << vpFun[0](a, b) << endl;
cout << "sub: " << vpFun[1](a, b) << endl;
cout << "mul: " << vpFun[2](a, b) << endl;
cout << "div: " << vpFun[3](a, b) << endl;
//system("pause");//調試環境:VS2013, Debug Win32
return 0;
}
```
運行效果:
