引用概述¶
引用 vs. 指针¶
引用(reference
)相对于指针(pointer
)而言,有如下异同:
- 相似:存储其他对象的内存地址
- 不同:初始化后的引用不能引用其他对象或设置为空
lvalue和rvalue¶
引用可分为左值引用(lvalue
)和右值引用(rvalue
):
lvalue
引用命名变量,用符号&
表示rvalue
引用临时对象,用符号&&
表示
语法¶
通用语法如下:
[storage-class-specifiers] [cv-qualifiers] type-specifiers declarator [= expression];
简化语法如下:
[storage-class-specifiers] [cv-qualifiers] type-specifiers [& or &&] [cv-qualifiers] identifier [= expression];
引用声明顺序如下:
- 说明符
- 可选的存储类说明符
- 可选的
cv
限定符 - 类说明符:类名
- 声明符
&
或者&&
运算符- 可选的
cv
限定符 - 标识符
- 可选的初始化器
引用类型的声明必须包含初始化器,以下情况除外:
- 显式
extern
声明 - 类成员的声明
- 类内声明
- 函数的参数或函数的返回类型声明
示例¶
引用对象拥有对象的地址,但其操作和对象一样,可看成是对象的别名
struct S {
short i;
};
int main() {
S s; // Declare the object.
S &SRef = s; // Declare the reference.
cout << (void *) &s << endl;
cout << (void *) &SRef << endl;
// 已初始化的引用不能引用其他对象
S ss;
SRef = ss;
cout << (void *) &s << endl;
cout << (void *) &ss << endl;
cout << (void *) &SRef << endl;
}
结果:
0x7ffc568084d0
0x7ffc568084d0
0x7ffc568084d0 // s
0x7ffc568084e0 // ss
0x7ffc568084d0 // SRef