繁体   English   中英

C ++移动副本构造函数和移动分配运算符

[英]C++ Move copy constructor and Move Assignment operator

我已经使用移动副本构造函数和移动副本赋值运算符制作了一个简单的应用程序,并且在每个应用程序上我都做了一个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;
} 

这是输出

输出画面

所以主要的问题是

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

谢谢你

您需要将std :: move用于move构造函数,并使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 . . .

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM