//6.10voidswap(int*a,int*b){int tmp =*a;*a =*b;*b = tmp;}intmain(){int a, b;int*pa =&a,*pb =&b;
cin >> a >> b;swap(pa, pb);
cout << a << b << endl;return0;}
//6.11voidreset(int&i){
i =0;}//6.12voidswap(int&a,int&b){int tmp = a;
a = b;
b = tmp;}intmain(){int a, b;
cin >> a >> b;swap(a, b);
cout << a << b << endl;return0;}
使用引用更加方便,不需要额外声明指针,也避免了指针拷贝
//6.13voidf(T)形参采用传值方式,实参的值被拷贝给形参
voidf(&T)采用传引用,改变形参的值即改变实参的值
//6.15
为了避免拷贝长字符串就使用引用类型,同时因为只执行查询操作而不改变字符串内容,所以声明为常量引用
c是char,占用1字节,拷贝代价很低所以不需要引用
occur需要改变实参的值,所以声明为引用而且不能是常量
//6.16
参数不进行修改,最好设为const,并且设为const接受的实参类型也更多
改为boolis_empty(const string &s){return s.empty();}//6.17boolisHaveUp(const string &s){for(int i =0; i < s.size(); i++)if(s[i]>='A'&& s[i]<='Z')returntrue;returnfalse;}voidchange(string &s){for(int i =0; i < s.size(); i++)
s[i]=tolower(s[i]);}//6.18(a)boolcompare(const matrix&,const matrix&);(b)vector<int>::iterator change_val(int, vector<int>::iterator);//6.19(a)不合法,函数声明只有一个参数,调用却提供两个
(b)合法,字面值常量可以作为常量引用形参的值
(c)合法
(d)合法
//6.20
如果需要修改参数内容则设置为普通引用类型,否则设为常量类型
不这么做会导致:
1.给使用者误导,即程序允许修改实参内容
2.限制了该函数所能接受的实参类型,不能把const对象,字面值常量等传递给普通的引用形参
//6.25intmain(int argc,char**argv){
string str;for(int i =0; i != argc, i++)
str += argv[i];
cout << str << endl;return0;}//6.26intmain(int argc,char**argv){for(int i =0; i != argc, i++)
cout <<"argc["<< i <<"]: "<< argv[i]<< endl;return0;}
//6.27intcount(initializer_list<int> il){int total =0;for(auto it = il.begin(); it != il.end(); it++)
total +=*it;return total;}//6.28const string&//6.29
initializer_list对象的元素永远是常量值,所以不可能通过设定引用类型来更改循环控制变量的内容
只有当initializer_list对象的元素类型是引用类型或容器类型才有必要设为引用