- 引用
1.1 引用是变量 | 对象的别名,操作引用等同于操作原有对象|变量。
1.2 使用引用的时候,必须先初始化,否则会报错。
1.3 引用不会开辟新的内存空间,没有内存地址。
引用相当于是外号,并不会产生全新的实体,所以不会开辟新的空间,操作引用等同于操作原有的对象实体。
使用引用:
int num = 24;
int &n = num;
n = 36;
std::cout << "num : " << num << std::endl;
引用声明必须先初始化,否则会报错,因为有了原有变量,才有原有变量的引用。
Declaration of reference variable 'n1' requires an initializer
int & n1;
指针也可以有引用
int * ps = #
int * &psr = ps;
数组没有引用,因为数组是一堆数的集合,但是数组中的元素是有引用的。
int array[]{1,2,3};
int & psa1 = array[0];
psa1 = 11;
std::cout << "array[0] : " << array[0] << std::endl;
#后台输出:
array[0] : 11
- 左值和右值
2.1 赋值表达式左边的一定是左值,右值只能出现在等号右边,左值可以出现在左边也可以出现在右边
2.2 判断是否是左值还是右值,就看能否取地址,如果能取地址,就是左值,否则就是右值
2.3 一般来说,变量 | 对象 大多数都是左值,而数值 | 运算的表达式 | 函数的返回值 大多数都是右值。
int getNum(){
int num = 12;
return num;
}
int num = 24; // num : 左值, 24:右值
int num1 = num; // num1: 左值, num:左值
int num2 = num + 12; // num2: 左值, num + 12:右值
int num3 = getNum(); // num3: 左值, getAge():左值
- 左值引用和右值引用
左值引用
左值引用是引用名前面加一个符号 & 来表示。
左值引用只能接受左值。
左值引用加上关键字 const,也可以接收右值。
int num = 24;
int &num1 = num;
const int & num2 = 36;
const int & num3 = num;
const int & 引用名,应用名就不能修改原变量的值。
右值引用
右值引用只能接受右值。
右值引用是引用名前面加一个符号 && 来表示。
int num = 24 ;
int && num1 = 36 ;
- 应用场景
#include <iostream>
int cal_add1(int a, int b){
return a + b;
}
int cal_add2(int & a, int b){
return a + b;
}
int cal_add3(int & a, int & b){
return a + b;
}
int cal_add4(int && a, int && b){
return a + b;
}
int cal_add5(const int & a, const int & b){
return a + b;
}
int main() {
int a = 12;
int b = 24;
std::cout << cal_add1(12,24) << std::endl;
std::cout << cal_add1(a,b) << std::endl;
std::cout << cal_add2(a,24) << std::endl;
std::cout << cal_add2(a,b) << std::endl;
std::cout << cal_add3(a,b) << std::endl;
std::cout << cal_add4(12,24) << std::endl;
std::cout << cal_add5(a,b) << std::endl;
std::cout << cal_add5(12,24) << std::endl;
return 0;
}
clion 有函数参数类型提示:
|