创建引用变量
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;
}
使用const的理由
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 如果数据对象是类对象,则使用引用。