c++ 左值引用和右值引用

c++ 左值引用和右值引用,第1张

  1. 引用
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  = &num;
int * &psr = ps;

数组没有引用,因为数组是一堆数的集合,但是数组中的元素是有引用的。

int array[]{1,2,3};
//int[3] & psa = array;
int & psa1 = array[0];
psa1 = 11;
std::cout << "array[0] : " << array[0] << std::endl;

#后台输出:
array[0] : 11
  1. 左值和右值
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():左值
  1. 左值引用和右值引用
左值引用
左值引用是引用名前面加一个符号 & 来表示。

左值引用只能接受左值。

左值引用加上关键字 const,也可以接收右值。

int num  = 24;                  // num :  左值,         24:右值
int &num1 = num;                 // num1:  左值引用,     num:左值
const int & num2 = 36;            // num2:  左值引用,    36:右值
const int & num3 = num;            // num3:  左值引用,   num:左值

const int & 引用名,应用名就不能修改原变量的值。

 右值引用
右值引用只能接受右值。

右值引用是引用名前面加一个符号 && 来表示。

int num = 24 ;      // num : 左值        24: 右值
int && num1 = 36 ;  // num1 :右值引用 ,  36: 右值
  1. 应用场景
#include 


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 有函数参数类型提示:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/673420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存