练习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元素自然也没被释放掉
所以是对的