Tôi đang bối rối khi một nhà xây dựng di chuyển được gọi là một hàm tạo bản sao. Tôi đã đọc các nguồn sau:Khi nào Move Constructor được gọi?
Move constructor is not getting called in C++0x
Move semantics and rvalue references in C++11
Tất cả những nguồn được một trong hai overcomplicated (Tôi chỉ muốn có một ví dụ đơn giản) hoặc chỉ hiển thị như thế nào để viết một di chuyển constructor, nhưng không phải làm thế nào để gọi nó. Ive đã viết một vấn đề đơn giản để cụ thể hơn:
const class noConstruct{}NoConstruct;
class a
{
private:
int *Array;
public:
a();
a(noConstruct);
a(const a&);
a& operator=(const a&);
a(a&&);
a& operator=(a&&);
~a();
};
a::a()
{
Array=new int[5]{1,2,3,4,5};
}
a::a(noConstruct Parameter)
{
Array=nullptr;
}
a::a(const a& Old): Array(Old.Array)
{
}
a& a::operator=(const a&Old)
{
delete[] Array;
Array=new int[5];
for (int i=0;i!=5;i++)
{
Array[i]=Old.Array[i];
}
return *this;
}
a::a(a&&Old)
{
Array=Old.Array;
Old.Array=nullptr;
}
a& a::operator=(a&&Old)
{
Array=Old.Array;
Old.Array=nullptr;
return *this;
}
a::~a()
{
delete[] Array;
}
int main()
{
a A(NoConstruct),B(NoConstruct),C;
A=C;
B=C;
}
hiện tại A, B và C đều có giá trị con trỏ khác nhau. Tôi muốn A có một con trỏ mới, B để có con trỏ cũ của C, và C để có một con trỏ null.
phần nào tắt chủ đề, nhưng nếu có thể đề xuất tài liệu mà tôi có thể tìm hiểu về các tính năng mới này, tôi sẽ biết ơn và có thể không cần hỏi thêm nhiều câu hỏi nữa.
Trên một vấn đề liên quan đến một phần, bạn có thể muốn kiểm tra bản sao và hoán đổi thành ngữ http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom cho bài tập của bạn nhà điều hành. – undu
[Câu hỏi thường gặp liên quan] (http: // stackoverflow.com/questions/3106110 /) – fredoverflow