C 中的拷貝構造,賦值和移動構造

2021-07-14 04:55:29 字數 1744 閱讀 3908

在說明這幾個名詞時,我們需要定義乙個測試類person,person類的測試環境為vs2013

一般情況下,在物件宣告時用拷貝建構函式對物件進行初始化(在編譯器進行優化的時候也會使用移動構造函\

數(在有臨時物件產生的情況下),這樣效率會高一些,如避免深度拷貝之類的操作),一旦初始化之後,在\

進行=運算將會使用賦值運算(在有臨時物件產生的情況下將會呼叫移動賦值運算子),認真的分析一下下面的\

示例程式吧!

person類的宣告,其中定義了兩個資料成員:name (string), id (int), 並且包含了這兩個資料域的\

setter方法,同時也實現了拷貝建構函式,賦值運算子,移動建構函式,移動賦值預算符(不過沒有用到),\

還有乙個列印累的資料成員的資訊的函式。

#pragma once

#include

using std::string;

class person

void setname(string name)

void desc();

};

person類的方法實現

#include "stdafx.h"

#include "person.h"

using

namespace

std;

person::person(int id, string name):

id(id), name(name)

person::~person()

//拷貝建構函式

person::person(const person& person)

//賦值

person& person::operator=(const person& person)

this->id = person.id;

this->name = person.name;

return *this;

}//移動建構函式

person::person(person&& person)

//移動賦值運算子

person& person::operator=(person&& person)

this->id = person.id;

this->name = person.name;

person.id = -1;

person.name = "";

return *this;

}void person::desc()

person person::copyperson()

person的測試時也就是為了測試移動建構函式,拷貝建構函式,以及賦值在什麼時候回發生呼叫。

#include "stdafx.h"

#include "person.h"

int _tmain(int argc, _tchar* argv)

程式的執行結果如下圖:

通過分析我們可以得出以下結論:

在新物件初始化時呼叫建構函式,如果在這個初始化過程中有臨時物件的產生,編譯器將會進行優化,呼叫移動建構函式。

在物件初始化以後進行的賦值操作,如果賦值過程中有臨時物件產生將會呼叫移動賦值運算。

c 11 移動構造 移動賦值 拷貝構造

最近對準備深入學習一下c 11所有的新特性,今天研究了一下c 11的std move和std forward,在研究這個的時候,需要對c 0xx的拷貝構造,拷貝賦值有一些了解.這個不知道的自己去了解,這裡記錄一下c 11新加的移動版本 移動構造 移動賦值和拷貝構造 拷貝賦值的比較,文章引用 現代c ...

移動拷貝建構函式和移動賦值

my string const char str my string my string 預設的建構函式淺拷貝 不用delete的原因是object ob ob1 一定分配好 my string const my string str 語法沒錯,可能編譯會拋 buffer new char len ...

C 的拷貝構造和移動構造

如果乙個建構函式的第乙個引數是自身類型別的引用,且任何額外引數都沒有預設值,則此建構函式是拷貝建構函式。c primer,第五版 class foo 類的成員中有指標時,使用深拷貝。include using namespace std class foo foo const foo default...