1.传值调用
double average(double a, double b); //返回a和b的平均值
//传值调用的理想用法
double z = average(x,y);
//无效情况
void swap(double a,double b);
swap (x,y) //传值调用并不会改变x和y的值,因为传值引用先复制,再运算
2.传引用调用(传左值引用调用)
//为解决传值引用的无效情况
void swap(double & a, double & b);
swap(x,y); //改变x,y的值
3.传对常量引用的调用(传常量引用调用)
string randomItem(vector <string> arr) //返回arr中的一个随机项
/*问题所在:
*存在拷贝行为,开销较为昂贵,但理论上不需要改变arr中的值,不需要拷贝
*/
//解决办法:传对常量的引用调用
string randomItem ( const vector<string> & arr)
//在这种情况下调用randomItem(vec)的时候 vec与arr同义,所以不用复制,而它又是const的。所以不能修改
//本质上提供了与传值调用可见的相同行为。
4.传右值引用调用(C++ 11 新特性)
核心概念:
右值存储的是要被销毁的临时量,当遇到x=rval的时候(rval是一个右值)可以通过move而不是复制进行实现。移动一个对象要比复制一个对象容易得多
//实现前面随机返回arr中的项(采用右值引用)
string randomItem(vector <string> && arr);
cout<<randomItem( { ''hello",''world"})<<endl; //调用右值的方法