c++primer plus阅读笔记(十)

自增的先后

operator ++ (int) ;a++
operator ++ ();    ++a

c++左值与右值

右值是一般都是临时对象,可能存在寄存器或可能被编码到机器指令的【立即数】中,所以右值无法使用【’&’】取地址。

int a;
a=++a;  //a是左值,而++a是operator++()返回的

左值引用和右值引用

int &;//为左值引用
int &&;//为右值引用const右值引用只能用于非const右值

右值与移动构造函数

右值是一个临时对象,在单行域之后生命期就结束了,对于函数返回的临时对象如下,过程是将堆栈对象a直接返回给temp的拷贝构造函数构造(旧式的编译器还会a先赋值给一个临时对象temp返回临时对象temp)

Time fn(){
    int a;
    return a;
}

Time temp=fn();

但是对于需要大规模new堆和堆内存数据复制的类来说,效率就很低,如下

class Time{
public:
    int *mem;
    int size;
    Time(Time& temp){
        mem=new int[size];
        for(int i=0;i<temp.size;i++){
            mem[i]=temp.mem[i];
        }
    }
}

此时可以使用移动构造函数,利用函数的重载,将构造函数设置为右值引用类型,直接堆内存指向右值

class Time{
public:
    int *mem;
    int size;
    Time(int &&temp){
        mem=temp.mem;
        temp.mem=0;//转移堆内存控制,同时析构函数delete[]0不会出现异常。
        size=temp.size;
    }

}

同样可以使用移动语义,对赋值预算符【=】添加一个移动赋值运算符版本

左值与移动构造函数

当一个新的对象使用左值进行构造时,如果希望使用移动构造函数,可以使用std::move(object)函数
下述代码中move会调用对象的移动赋值函数,如果没有的话不允许下述用法。

Time a;
Time b
b=std::move(a); //使用移动构造函数.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章