找回密码
 立即注册
首页 业界区 安全 C++移动语义

C++移动语义

莅耸 3 小时前
一. 浅拷贝与深拷贝
  1. struct Node{
  2.     int size;
  3.     int *p;
  4.     Node() = default;
  5.     Node(int x){
  6.         size = x;
  7.         p = new int(size);
  8.     }
  9. };
复制代码
1. 浅拷贝

按位拷贝对象,如果拷贝对象中存在指针,那么两指针指向的地址相同(但是两指针的地址不一定相同)
  1. Node shllowCopy(Node &v){
  2.         this -> size = v.size;
  3.         this -> p = v.p;
  4. }
复制代码
2. 深拷贝

拷贝对象的所有属性,如果拷贝对象中存在指针,那么会在堆上重新开辟一片相同大小的空间,并让指针指向该空间
  1. Node deepCopy(Node &v){
  2.         this -> size = v.size;
  3.         this -> p = new int[size];
  4.         for(int i = 0; i < size; i++){
  5.             this -> p[i] = v.p[i];
  6.         }
  7. }
复制代码
二. 左值与右值


  • 左值(lvalue):表达式结束后仍然存在的持久对象
  • 右值(rvalue):表达式结束后就被销毁的临时对象
一般来说,有变量名的都是右值,没有变量名的是左值
特殊:字符字面量(如'c','a')这种是右值;但是字符串字面量,如"abcd"这种,由于它存在于静态存储区,所以字符串字面量均为左值
三. 左值引用与右值引用

1. 左值引用(&)

左值引用本质上是给左值变量起了一个别名

  • 改变任意一方,双方都改变
  • 只能绑定在左值上
  • 特殊:const int &x = 10,为常量左值引用,可以绑定右值,但是不可更改
2. 右值引用(&&)

绑定在右值上,可以延长临时对象的生命周期,并允许更改
应该注意的是,右值引用类型的变量,它本身是个左值
比如说:int &&x = 10,x的类型是右值引用,但它本身是个左值
如果你要把x再次当成右值传为另一个函数或者赋值给另一个数,那么直接传是不行的,这个时候就要用到std::move()
四. 强转右值std::move()

std::move()可以将左值强制转化为右值,类型上变成右值引用类型
作用是把原对象指向堆内存空间的指针地址转交给新对象,然后将原对象的该指针
置为nullptr
但是std::move()对基本类型,如int,double,char,指针无效,因为他们的值就存在于栈上,不指向任何外部资源
比如说:
[code]int res = 1;int ans = std::move(res);std::cout

相关推荐

您需要登录后才可以回帖 登录 | 立即注册