一、函数参数引用
交换两个字符串,如下代码所示:
void swap(char *&x, char *&y)//指针引用,传入函数的是实参,不是形参
{
char *temp;
temp = x;
x = y;
y = temp;
}
int main()
{
char *a = "My name is Ann.";
char *b = "What's your name?";
swap(a, b);
return 0;
}
采用二维指针代替引用
void swap(char **x, char **y)//二维指针代替引用
{
char *temp;
temp = *x;
*x = *y;
*y = temp;
}
int main()
{
char *a = "My name is Ann.";
char *b = "What's your name?";
swap(&a, &b);//注意是a,b的引用
return 0;
}
二、函数返回值的引用
const float pi = 3.14f;
float f;
float f1(float r)
{
f = r*r*pi;
return f;
}
float& f2(float r)
{
f = r*r*pi;
return f;
}
int main()
{
float f1(float=5.0); //正确,函数f1默认参数调用
float& f2(float=5.0);//正确,函数f2默认参数的调用
float a = f1();//正确,f1的返回值赋给a
float& b = f1();//错误,函数f1里,f的值回复给一个临时变量temp,该temp有编译器隐式建立,建立该temp的引用b后,函数执行完毕,temp消失,导致错误
float c = f2();//正确,f2的返回值未建立隐式临时变量temp,直接将全局变量f返回给主函数
float& d = f2();//正确,函数直接使用全局变量的引用
}
三、常量引用
class Test{
public:
void f(const int &arg);
private:
int value;
};
void Test::f(const int &arg)
{
arg = 10;//错误,arg是一个常量类型的引用,值在函数体内不能被修改
cout << "arg=" << arg << endl;
value = 20;
}
int main()
{
int a = 7;
const int b = 10;
int &c = b;//错误,b为常量,c必须为常量引用
const int &d = a;
a++;
d++;//d是常量引用,不能使用常量引用该变变量的值
Test test;
test.f(a);
cout << "a=" << a << endl; //输出,a=8
return 0;
}