1. 引用是已定义变量的别名(另一个名称)。 定义引用的一般格式:类型 &引用名 = 变量名; 例如:int a = 1; int &ra = a; // b是a的别名,因此a和b是同一个单元 注意:定义引用时一定要初始化,指明该引用变量是谁的别名。 2. 引用的主要用途: 2.1 用作函数的形参(主要指结构和对象参数)。通过将引用变量用作参数,函数将使用原始数据,而不是其副本。
// 演示交换两个变量的值 #include <iostream> using namespace std; void swapref(int &ra, int &rb) // 引用传递 { int tmp; tmp = ra; ra = rb; rb = tmp; } void swappoi(int *p, int *q) // 指针传递 { int tmp; tmp = *p; *p = *q; *q = tmp; } int main() { int a = 100; int b = 200; cout << "a = " << a << " b = " << b << endl; swapref(a, b); cout << "a = " << a << " b = " << b << endl; swappoi(&a, &b); cout << "a = " << a << " b = " << b << endl; return 0; }
结果:
#include <iostream> using namespace std; double cube(double val) { val *= val * val; return val; } double refcube(double &rval) { rval *= rval * rval; return rval; } double const_refcube(const double &rval) { return rval * rval * rval; } int main() { double x = 3.0; // 按值传递 //double val = cube(x + 2.0); cout << cube(x) << endl; cout << cube(x + 2.0) << endl; int k = 10; cout << cube(k) << endl; double d[3] = { 2.0, 3.0, 4.0 }; cout << cube(d[2]) << endl; // 按引用传递 cout << refcube(x) << endl; //cout << refcube(3.0) << endl; // error, 非常量引用的初始值为左值 //cout << refcube(x + 2.0) << endl; // error, 非常量引用的初始值为左值 long ll = 3.0; //cout << refcube(ll) << endl; // error //如果引用参数是const,则编译器将在下面两种情况下生成临时变量: // 1.实参的类型正确,但不是左值; // 2.实参的类型不正确,但可以转换为正确的类型; cout << const_refcube(3.0) << endl; cout << const_refcube(ll) << endl; cout << const_refcube(ll + 1.0) << endl; return 0; }
1.使用const可以避免无意中修改数据的编程错误; 2.使用const可以使函数能够处理const和非const实参,否则将只能接受非const数据; 3.使用const引用使函数能够正确生成并使用临时变量。
1.引用的另一个作用是用于返回引用的函数。 2.函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。 3.注意:不能返回对局部变量的引用。
// 演示字符串拼接 #include <iostream> #include <string> using namespace std; string str_join1(const string &s1, const string &s2) { string str; str = s1 + s2; return str; } const string& str_join2(string &s1, const string &s2) { s1 = s1 + s2; return s1; } const string& str_join3(const string &s1, const string &s2) { string str; str = s1 + s2; return str; } int main() { string ss1("aaaaaa"); string ss2("bbbbbb"); string result; result = str_join1(ss1, ss2); cout << result << endl; result = str_join2(ss1, ss2); cout << result << endl; //result = str_join3(ss1, ss2); // 程序崩溃,不能返回对局部变量的引用。 //cout << result << endl; return 0; }
1.使用引用参数的主要原因有两个。 1.1 能够修改调用函数中的数据对象 1.2 通过传递引用而不是整个数据对象(当数据对象较大时,如结构和类对象),可以提高程序运行的速度。 2. 对于传递的值而不作修改的函数。 2.1 如果数据对象很小,如内置数据类型或小型结构,则按值传递。 2.2 如果数据对象是数组,则使用指针,并将指针声明为指向const的指针。 2.3 如果数据对象是较大的结构,则使用const指针或const引用,以提高程序的效率。这样可以节省拷贝结构所需的时间和空间。 2.4 如果数据对象是类对象,则使用const引用。类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因。因此,传递类对象的标准方式是按引用传递。 3. 对于修改调用函数中数据的函数。 3.1 如果数据对象是内置数据类型,则使用指针。 3.2 如果数据对象是数组,则只能使用指针。 3.3 如果数据对象是结构,则使用引用或指针。 3.4 如果数据对象是类对象,则使用引用。