Hàm khởi tạo mặc định và di chuyển asignment được tạo bởi trình biên dịch sẽ gọi hàm khởi tạo di chuyển/sắp xếp cho từng thành viên của lớp.
Nếu lớp học của bạn chỉ có thành viên thô, "bộ đệm char *", bạn phải viết hoạt động di chuyển của riêng bạn.
Nếu lớp của bạn chỉ có "thành viên được quản lý", "vectơ", ví dụ, các hoạt động di chuyển mặc định cho lớp học của bạn sẽ được chấp thuận vì nó ủy nhiệm hoạt động cho từng thành viên.
Nếu lớp học của bạn đã trộn lẫn với "thành viên thô", vector và * int ví dụ "các thành viên quản lý", các hoạt động phong trào của bạn sẽ phải thực hiện di chuyển thủ công các nguồn tài nguyên thô và gọi hoạt động di chuyển cho các đối tượng quản lý:
class MyObject {
public:
// ...
MyObject(MyObject&& other) : vector1(std::move(other.vector1)) {
// We use vector's move constructor^
// and then move ourself the char* buffer
buffer1 = other.buffer1;
other.buffer1 = nullptr;
}
MyObject& operator=(MyObject&& other) {
// We use vector's move asignment operator
vector1= std::move(other.vector1);
// and then move ourself the char* buffer
std::swap(buffer1,other.buffer1);
return *this;
}
//...
private:
vector<char> vector1;
char * buffer1;
};
std :: di chuyển (other.vector1) là cần thiết vì bên trong chức năng khác.vector1 là một giá trị. Chúng ta phải nói với trình biên dịch, chúng ta sẽ không sử dụng giá trị vector1 sau trong mã chức năng để giá trị của nó có thể được di chuyển.
Bạn vẫn nên có một hàm tạo di chuyển, vì 'std :: vector' có thể hưởng lợi từ việc di chuyển. Trình biên dịch tạo ra (di chuyển theo từng phần) phải đủ tốt. –
Tôi tin rằng nó được gọi là * Sao chép Constructor *, chứ không phải * Di chuyển Constructor *. –
@AlexFarber: Trình tạo bản sao mặc định là đủ tốt nếu không có con trỏ thành viên nào (như đã đề cập ở trên bởi T.C.). –