声明引用:
在声明引用时,需要使用&符号,同时必须初始化引用。
<类型>& <引用名称> = <所引用的对象>;
<类型>&<别名>=<原来的名字>。
可以通过修改引用的值(别名),来修改原始变量名的值。
例子:int& ref = variable;
#include <iostream>
int main()
{
int variable = 42;
int& ref = variable; // 声明引用并初始化
ref = 56; // 修改引用的值,同时也修改了原始变量的值
std::cout << variable << std::endl; // 输出:56
return 0;
}
引用和指针的区别:
- 引用和指针都可以用来间接访问对象,但是有几点不同。
- 引用必须在声明时进行初始化,而指针可以在任何时候进行赋值和修改。
- 引用不是一个独立的对象,它只是原对象的别名;而指针是一个独立的对象,可以指向不同的对象。
- 引用不需要使用解引用运算符
*
来访问对象,而指针需要使用*
运算符进行解引用。
#include <iostream>
int main()
{
int variable = 42;
int* ptr = &variable; // 声明指针并初始化,指向变量variable
int& ref = variable; // 声明引用并初始化,指向变量variable
*ptr = 56; // 修改指针所指向的变量的值
std::cout << variable << std::endl;// 输出:56
ref = 78; // 修改引用所指向的变量的值
std::cout << variable << std::endl; // 输出:78
return 0;
}
引用作为函数参数:
- 引用经常被用作函数参数,可以传递大型对象并避免对象的复制。
- 在函数参数列表中,使用引用类型可以直接修改原始对象而不是传递副本。
- 函数参数的引用可以使用
const
关键字来避免对原始对象的修改。 -
#include <iostream> void changeValue(int& ref) { ref = 99; // 修改引用所指向的变量的值 } int main() { int variable = 42; changeValue(variable); // 传递变量的引用给函数 std::cout << variable << std::endl; // 输出:99 return 0; }
引用作为函数返回值:
- 返回引用的函数可以用于返回函数内部创建的局部变量的引用。但需要注意返回的引用不应指向在函数内部声明的局部变量,因为局部变量在函数执行完毕后会被销毁。
- 如果返回函数内部的局部变量的引用,会导致悬空引用,访问悬空引用是错误的行为。
#include <iostream>
int& getVariable()
{
int variable = 42;
return variable; // 错误!不能返回局部变量的引用
}
int main()
{
int& ref = getVariable(); // 使用引用接收函数的返回值
std::cout << ref << std::endl; // 输出:未定义的值(非法操作!)
return 0;
}
注释:在这个例子中,我们定义了一个函数getVariable
,它返回一个整数的引用。然而,函数内部的变量variable
是一个局部变量,当函数执行完毕后,该变量将被销毁。所以返回它的引用是错误的,会导致未定义行为。
常量引用
-
定义常量引用:
- 在引用声明时,可以在类型前加上
const
关键字,用来指示引用的对象是常量。例如:const int& ref = variable;
- 常量引用可以绑定到常量对象,也可以绑定到非常量对象。
- 在引用声明时,可以在类型前加上
-
不能修改常量引用所引用的对象:
- 常量引用的主要特点是不能通过引用来修改所引用的对象的值。
- 任何试图通过常量引用修改所引用对象的操作都将导致编译错误。
-
优点:
- 常量引用可以用于函数参数,用于避免函数对传入的参数进行修改。这样可以确保函数不会不小心修改调用者传递给它的对象。
- 常量引用还可以用于避免不必要的对象复制,在函数参数传递或函数返回值时更加高效。
#include <iostream>
void printValue(const int& ref)
{
// ref引用的是常量,不可修改
// ref = 10; // 错误,不能修改常量引用所引用的对象
std::cout << "The value is: " << ref << std::endl;
}
int main()
{
int variable = 42;
const int& ref = variable;
printValue(ref); // 调用函数并传递常量引用
return 0;
}