1、定义声明引用变量
引用变量在定义时使用 &
符号。它必须在初始化时绑定到一个已经存在的变量,且绑定后不可更改。引用变量是在C++中新的复合类型。引用变量被定义为一个变量的别名,即引用变量和其指向的变量代表同一个值,指向同一个存储单元,并且引用变量自从赋值起就已知跟着这个变量,不会再发生改变,也就是一个变量两个名字,所以更改其中的任何一个这个变量都会发生改变。
&
符号可以取变量的地址,同时它的另一个含义就是用来声明引用变量:
int i;
int & r = i;
例如,
#include <iostream>
using namespace std;
int main ()
{
// 声明正常的变量
int i;
double d;
// 声明引用变量
int& r = i;
double& s = d;
i = 3;
cout << "正常变量i的值 : " << i << endl;
cout << "引用变量r的值 : " << r << endl;
d = 12.7;
cout << "正常变量d的值 : " << d << endl;
cout << "引用变量s的值 : " << s << endl;
return 0;
}
2、引用变量和指针的区别
不存在空引用。引用必须连接到一块合法的内存。引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。引用必须在创建时被初始化。指针可以在任何时间被初始化。
引用 | 指针 |
---|---|
必须在声明时初始化 | 可以在声明后再赋值 |
一旦绑定后不能更改 | 可以指向不同的变量 |
语法更简洁, 更贴近实际使用变量的方式 | 需要显式解引用操作(如 *ptr ) |
不存在空引用 (必须绑定到有效对象) | 可以是 nullptr |
更适合用于函数参数 和返回值的场景 | 更适合动态内存分配 或需要修改指针地址的场景 |
区别示例:
#include <iostream>
using namespace std;
// 使用引用
void updateByReference(int &ref) {
ref += 10; // 修改引用,实际修改的是原变量
}
// 使用指针
void updateByPointer(int *ptr) {
if (ptr) { // 检查指针是否为 nullptr
*ptr += 10; // 修改指针指向的变量
}
}
int main() {
int a = 5;
// 使用引用
std::cout << "Before updateByReference: a = "
<< a << std::endl;
updateByReference(a);
std::cout << "After updateByReference: a = "
<< a << std::endl;
// 使用指针
int b = 5;
std::cout << "Before updateByPointer: b = "
<< b << std::endl;
updateByPointer(&b); // 传递 b 的地址
std::cout << "After updateByPointer: b = "
<< b << std::endl;
// 指针可以为空
int *nullPtr = nullptr;
// 安全检查避免操作空指针
updateByPointer(nullPtr);
return 0;
}
3、引用作为参数
C++引用作为参数传递,直接传入地址,不再开辟新的复制空间,C语言中没有引用,只有指针。
例如,
#include <iostream>
using namespace std;
int main()
{
void swap(int & ,int&);
int i =3,j = 5;
swap(i,j);
cout<<"i="<<i<<endl<<"j="<<j<<endl;
getchar();
return 0;
}
void swap(int &a,int &b)
{
int temp;
temp = a;
a =b;
b= temp;
}
4、引用作为返回值
引用作为函数的返回值时,必须在定义函数时在函数名前将&
。用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本。
例如,
#include<iostream>
using namespace std;
int value[10];
int error=-1;
int &func(int n){
if(n>=0&&n<=9)
//返回的引用所绑定的变量
//一定是全局变量,
//不能是函数中定义的局部变量
return value[n];
else
return error;
}
int main(){
func(0)=10;
func(4)=12;
cout<<value[0]<<endl;
cout<<value[4]<<endl;
return 0;
}
5、常量引用
使用 const
修饰引用,可以防止通过引用修改原变量的值。常用于函数参数,避免复制的同时保护数据。
#include <iostream>
using namespace std;
void display(const int &x) {
// x 是常量引用,不能修改其值
std::cout << "Value: " << x << std::endl;
}
int main() {
int num = 100;
display(num); // 传递常量引用
return 0;
}