C ++移动复制构造函数和移动赋值运算符

时间:2014-03-06 01:40:02

标签: c++ class runtime-error copy-constructor move-semantics

我已经使用移动复制构造函数和移动复制赋值运算符创建了一个简单的应用程序,并且在每个应用程序上我都做了一个cout语句,只是告诉我,正在执行它们。但是在执行期间,我没有看到来自移动复制操作符的任何语句,而只是来自编译器已经提供的默认语句。这是我的代码:

#include <iostream>
#include <string>
using namespace std;

class Names{
private:
    string* name;
public:
    Names(string place_name){
        cout << "Overloaded constructor" << endl;
        name = new string;
        *name = place_name;
    }
    //copy constructor
    Names(Names& cpy){
        cout << "Copy constructor" << endl;
        name = new string;
        *name = *cpy.name;
    }
    //assignment 
    Names& operator =(const Names& cpy){
        cout << "Assignment operator" << endl;
        name = new string;
        *name = *cpy.name;
        return *this;
    }
    //move constructor
    Names(Names&& cpym){
        cout << "Copy move constructor" << endl;
        name = cpym.name;
        cpym.name = NULL;
    }
    //move assignment operator
    Names& operator=(Names&& cpym){
        cout << "Copy assignment operator" << endl;
        delete name;
        name = cpym.name;
        cpym.name = NULL;
        return *this;
    }
    //destructor
    ~Names(){
        cout << "Deallocating memory" << endl;
        delete [] name;
    }
};

int main(){
    Names nme("Bob");
    Names copin("something");
    copin = nme;
    system("pause");
    return 0;
} 

这是输出

Output screen

所以主要问题是

1) Why isn't the cout statement being show for the move constructor?
2) Is my declaration for move constructor correct

谢谢你。

1 个答案:

答案 0 :(得分:1)

你需要使用std :: move作为移​​动构造函数并移动赋值运算符。请参阅下面的主要功能:

Names A(Names name) {
    return name;
}
int main(){
    Names nme("Bob");
    Names copin("something");
    cout << "before std::move(nme);" << endl;
    copin = std::move(nme);
    cout << "before std::move(GetName());" << endl;
    Names tom = std::move(nme);
    cout << "before A(Names(\"dick\");" << endl;
    // move constructor is also called when using temp rvalue
    Names dick = A(Names("dick"));
    system("pause");
    return 0;
}

输出:

Overloaded constructor
Overloaded constructor
before std::move(nme);
Copy assignment operator
before std::move(GetName());
Copy move constructor
before A(Names("dick");
Overloaded constructor
Copy move constructor
Copy constructor
Deallocating memory
Deallocating memory
Press any key to continue . . .

还有一个问题,你的析构函数不应该删除[]名称,只需删除名称;