拷貝和賦值區別

拷貝構造,對象賦值

拷貝是構造行爲,狀態取決於用於構造的對象;賦值是對已構造對象進行狀態更新。賦值側重於更新,構造側重於構造。

等號不等於賦值,他可能是拷貝構造

下面這個語句被識別爲構造

string str="apple";
string strr=str;//我是構造,不是賦值

下面這個語句被識別爲賦值:

string str="apple";
string strr
strr=str;//我纔是賦值

等號“=”是賦值還是構造取決於左值是否第一次出現。

函數返回值是拷貝構造

函數返回值如果是一個類,那麼返回的對象首先將會被拷貝構造到一個臨時對象,這個對象是const的。


A fun()
{
    A a;
    return a;//拷貝g構造到一個const temp_class_A中
}

class A
{
public:
    A() 
    { 
        cout << "Create" << endl; 
        m_i = 4396;
    }
    A(const A& a)
    { 
        m_i = a.m_i;
        std::cout << " A Copy constructor!" << endl; 
    }
    A& operator=(const A& a) 
    { 
        std::cout << " Assignement constructor!" << endl;
        return *this;
    };
    ~A() { std::cout << "Delete" << endl; }
    int m_i;
};
int main()
{
    A dd;
    dd= fun();

    return 0;
}

結果如下:
Create

Create                                     # dd對象創建
Create                                     # a對象創建
 A Copy constructor!                       # 返回語句,拷貝構造臨時對象
Delete                                     # a對象析構
 Assignement constructor!                  # 返回值賦值
Delete                                     # 臨時對象析構
Delete                                     # 主進程退出,dd對象析構

無論是拷貝構造還是狀態賦值,最好將其唯一的參數設置爲const屬性,這是因爲:

  • 拷貝和賦值,一般而言,狀態是一模一樣,不應該也沒必要改變
  • 如果函數返回該類,必須聲明爲const才能匹配
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章