传值调用
函数的形参被初始化为实参的值的复制,这种传递参数的方式称为传值调用。
// compute the median of a `vector<double>'
// note that calling this function copies the entire argument `vector'
double median(vector<double> vec)
{
typedef vector<double>::size_type vec_sz;
vec_sz size = vec.size();
if (size == 0)
throw domain_error("median of an empty vector");
sort(vec.begin(), vec.end());
vec_sz mid = size/2;
return size % 2 == 0 ? (vec[mid] + vec[mid-1]) / 2 : vec[mid];
}
引用调用
double grade(…, const vector<double>& chw)
chw 为容纳double类型元素的vector的引用 所谓一个标识符是一个对象的引用(reference):此标识符为该对象的别名—— 亦即绰号。对引用的任何操作等同于对被引用对象的操作。
vector<double> homework;
vector<double>& hw = homework;
当函数的形参为引用时(引用调用),函数调用中对形参的访问就是对实参的访问(实际上还是使用指针实现的),系统不会复制实参的值至形参,避免了复制实参的开销,提高了运行效率。
非常量引用调用
读取家庭作业成绩
istream& read_hw(istream& in, vector<double>& hw)
若希望在函数中改变其实参,则必须定义形参为非常量引用类型,且必须爲其传递一个左值。
左值就是出现在赋值操作符(operator=)左边的变量,可以被赋值。右值是放在赋值操作符右边给其它变量赋值的变量或常量。