第5-6章
練習5.25
#include<iostream> using std::cin; using std::cout; using std::endl; #include<fstream> using std::ifstream; #include<string> using std::string; #include<vector> using std::vector; //#include<stdexcept> using std::runtime_error; int main() { int i1, i2; while (cin >> i1 >> i2) { try { if (i2 == 0) throw runtime_error("division can't be zero!"); cout << i1 / i2 << endl; } catch (runtime_error err) { cout << err.what() << "\ntry again?y or n" << endl; char c; cin >> c; if (!cin || c == 'n') break; } }
練習6.23
#include<iostream> using std::cin; using std::cout; using std::endl; #include<string> using std::string; #include<vector> using std::vector; //#include<stdexcept> using std::runtime_error; using std::begin; using std::end; void print(int i) { cout << i << endl; } void print(const int *ia,const int size) { for (int i = 0; i != size; ++i) cout << ia[i] << endl; } void print(const int *beg, const int *end) { while (beg != end) cout << *beg++ << endl; } int main() { int i = 0, j[2]{ 1,2 }; print(i); print(j, begin(j)-end(j)); print(begin(j), end(j)); system("pause"); }
練習6.32
先明確幾個點
引數傳遞: 每次呼叫函式時都會重新建立它的形參,並用傳入的實參對形參進行初始化.
什麼意思呢,比如 形參是 int i int &i 傳入的是j
那就是int i =j ; int &i = j;
形參不管是引用還好,還是普通的型別 都是這個過程
而返回一個值 (不管是返回一個普通的型別 還是一個引用) 的方式和初始化一個變數或形參的方式完全一樣: 返回值用於初始化呼叫點的一個臨時量,該臨時量就是函式呼叫的結果
比如 一個函式
(1) int f1(int i)
{return i}
(2) int &f2(int i)
{int &j = i;return j }
我們呼叫(1):
int i = 2;
int j = f1(i);
這裡發生了什麼呢? 就是 int tmp = i ; int j = tmp;
ok 再來看 呼叫 (2)
int & k = f2(i) ;
理想的情況是 int & tmp = j ; 實際是 int &tmp = i (a)
int & k = tmp;
但是 i是區域性變數 (跟全域性變數i不是一個i 這個i是f2呼叫時,生成的形參i ) 它在 (a) 步完成之後就被釋放掉
所以這個是錯的
再來看 練習6.32的題, 它返回的是arry[index] 這個實際是arry指向的陣列的第index元素的引用 實際就可以把它看成 *(arry+index) 因為使用引用的型別的物件 就可以把它看成它引用的物件
arry是一個指標 它跟全域性變數 比如 list 指的是同一個記憶體地址 當然跟list 不是一個物件,arry在函式完成之後被清空了,但arry指向的陣列沒有被釋放掉 因為全域性變數 list 也指那個地方 那第index元素自然也沒被釋放掉
所以是對的