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); //使用移動構造函數.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章