左值与右值

一.左值与右值

1.概念

​ 左值顾名思义是在表达式左边的值如:a = b + c,a就是表达式中的左值,左值可以被修改(前提没有被const修饰),有固定地址可以被访问。通俗来讲左值表常态,右值表临时。右值就是表达式 a = b + c 中的 b+c,就是表达式右边的值没有固定地址,就是临时对象(使用完系统自动销毁) ,也不可以被修改(总不能写成 b + c = 2)。

2.左值引用

左值引用也就是传统的C++引用,通过&符号来声明,它可以使得标识符关联到左值。引用是已定义变量的别名,例如下面将b作为a变量的别名,b和a指向相同的值和内存单元。

int a = 1;
int& b = a;

引用必须在创建时就要进行初始化,一旦与某个变量关联起来,就将一直相关联,不会中途关联到其他变量

3.右值引用

在C++11引入了右值引用(rvalue reference)的概念,通过&&符号来声明,右值引用可以关联到右值。

int && a = 1;
cout << "a = " << a << ", " << &a<< endl;
  • 主要用途

​ 引入右值的目的之一实现移动语义

​ 移动语义是一种优化技术,它允在对象之间转移资源的所有权,而不是进行资源的复制或者拷贝。移动语义这种技术正是通过使用右值引用来实现的。

​ 例:假如你拜张三丰为师,你要向他学习武功,从他那里慢慢学肯定是没有直接吸收他的功力效果快。c++11之前当调用拷贝构造函数或赋值运算符时会对对象进行拷贝操作,也就是会申请一块新的内存空间,然后把数据复制到新的内存空间当中,但是这对于大型对象来说工作量是很大的,当然在一些情况下这是必要的操作,但是在某些场景下,可能其实不用额外拷贝一份,只需要将对象的资源所有权从一个对象转移到另一个对象就可以满足要求了

/*************************************************************************
        > File Name: ref.cpp
        > Author: 
        > Mail: 
        > Created Time: Thu Aug 15 11:25:30 2024
 ************************************************************************/

#include <iostream>
#include <utility>
using namespace std;

class test1 {
public:
    test1(int x) : x(x) { // 初始化列表
        cout << this << "构造函数" << endl;
    }  // 构造函数
    test1(const test1& t) {
        cout << this <<"拷贝构造函数"  << endl;
    } // 拷贝构造函数
    test1(test1&& t) {
        cout << this << "移动拷贝构造函数" << endl;
    }      // 移动拷贝构造函数
    ~test1() {
        cout << this << "析构函数" << endl;
    }                // 析构函数

private:
    int x;
};

int main() {
    //int &&a = 1;
    //cout << a << endl << &a << endl;

    test1 *a = new test1(100);
    test1 *b = new test1(*a);
    test1 c(100);
    test1 d = move(c);

    delete a;   // new申请的内容必须delete
    delete b;

    return  0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值