一. 浅拷贝与深拷贝
- struct Node{
- int size;
- int *p;
- Node() = default;
- Node(int x){
- size = x;
- p = new int(size);
- }
- };
复制代码 1. 浅拷贝
按位拷贝对象,如果拷贝对象中存在指针,那么两指针指向的地址相同(但是两指针的地址不一定相同)- Node shllowCopy(Node &v){
- this -> size = v.size;
- this -> p = v.p;
- }
复制代码 2. 深拷贝
拷贝对象的所有属性,如果拷贝对象中存在指针,那么会在堆上重新开辟一片相同大小的空间,并让指针指向该空间- Node deepCopy(Node &v){
- this -> size = v.size;
- this -> p = new int[size];
- for(int i = 0; i < size; i++){
- this -> p[i] = v.p[i];
- }
- }
复制代码 二. 左值与右值
- 左值(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 |