gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:57 28 4
gpt4 key购买 nike

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

#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

谢谢你。

最佳答案

move 构造函数和 move 赋值运算符需要使用 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 . . .

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

关于C++ move 复制构造函数和 move 赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22213163/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com