int age = 30; // 定义int型变量
int *page = &age; // 定义int *指针page, 指向age
// 修改指针解引用来修改变量
*page = 50;
std::cout << *page << "," << age << std::endl;
用法①:取地址运算符,当&
放在一个变量名之前时,它是一个一元运算符,用于获取该变量的内存地址。int *ptr = &var;
中的&var
就是取var
变量的地址
int age = 30;
int &ref_age = age; // ref_age是age的引用,改变ref_age等同于改变age
用法②:引用声明符,当&
放在类型名称后面和变量名前面时,它用于声明一个引用变量。此时,它不是取地址,而是定义了一个新变量,它是另一个已存在变量的别名。例如,int &ref_age = age;
中的&
是用来声明ref_age
是一个引用,它引用的是age
变量
void increment(int &num) {
num++;
}
int z = 5;
increment(z); // z的值现在变为6
用法③:作为参数传递,在函数的参数列表中,使用&可以声明引用参数,这个函数体内形参发生变化实参也会随之改变
#include <iostream>
class MyClass {
public:
// 成员变量m_ref是int的引用
int &m_ref;
// 构造函数接受一个int类型的引用参数,并用它初始化m_ref
MyClass(int &ref) : m_ref(ref) {
// 初始化列表中使用&来绑定传入的引用到成员m_ref
}
// 方法用于修改m_ref所引用的值
void modifyReferencedValue(int newValue) {
m_ref = newValue;
}
};
int main() {
int externalValue = 10;
MyClass obj(externalValue); // 将externalValue的引用传递给MyClass的构造函数
std::cout << "Before modification: " << externalValue << std::endl;
obj.modifyReferencedValue(20); // 通过对象修改引用的值
std::cout << "After modification: " << externalValue << std::endl; // 输出20,因为obj.m_ref和externalValue是同一个值的不同引用
return 0;
}
用法④:在C++11及以后的版本中,可以在类的构造函数初始化列表中使用引用,以此来初始化类的引用类型成员变量。这样做可以让类的成员直接引用外部对象,从而实现共享状态或提供一种直接操作外部资源的方式。不过,需要注意的是,当成员变量是引用类型时,构造函数在创建对象时必须明确地初始化这个引用成员,且不能默认初始化
int &getRefToX() {
static int x = 0;
return x;
}
int main() {
int &refX = getRefToX();
refX = 10;
std::cout << getRefToX(); // 输出10,因为refX修改了静态变量x的值
return 0;
}
用法⑤:作为返回类型,函数也可以返回引用,允许函数直接修改外部变量或返回对象的引用以便连续修改
int a = 5; // 二进制表示为0101
int b = 3; // 二进制表示为0011
int c = a & b; // c的结果为1 (二进制0001)
用法⑥:位与运算符,在表达式中,当&
两边都是整数时,它作为位与运算符,对两个操作数的每一位执行逻辑与操作