Sao chép để khởi tạo đối tượng mới bằng cách sao chép nội dung của đối tượng hiện có, gán cho ghi đè đối tượng hiện có với nội dung của các đối tượng khác - hai đối tượng này rất khác nhau. Đặc biệt, đây
SomeClass a;
SomeClass b = a;
là bản sao khởi - bạn đang sao chép a
để tạo ra một SomeClass mới gọi là b
sử dụng cú pháp của hình thức
T x = y;
này có tác dụng cách gọi SomeClass
's sao chép constructor (giả sử có một và nó có thể truy cập). Trình tạo bản sao mặc định do trình biên dịch tạo ra sẽ thực hiện sao chép thành viên a
; bạn có thể thay thế nó bằng chính bạn nếu cần, ví dụ:
SomeClass(const SomeClass& rhs)
: x(rhs.x)
{}
(Lưu ý rằng đây là một ví dụ rất nhàm chán, vì nó chỉ làm những gì các ngầm định copy constructor sức.)
Di chuyển trên, đây
SomeClass c(a);
là trực tiếp khởi bằng cách sử dụng hàm tạo bản sao. Nói chung sẽ có tác dụng tương tự như trên, nhưng điều này là đáng đọc:
http://www.gotw.ca/gotw/036.htm
Ngoài ra, xem ở đây:
http://www.gotw.ca/gotw/001.htm
trường hợp cuối cùng của bạn, cụ thể là
b = c;
là bài tập. Các ngữ nghĩa của điều này thường phải ghi đè lên b
với nội dung của c
(mặc dù một số thứ, chẳng hạn như std::auto_ptr
, có ngữ nghĩa phân bổ lạ, vì vậy hãy chú ý). Để thực hiện toán tử gán của riêng bạn, bạn viết một cái gì đó như thế này (lưu ý rằng đây là một ví dụ rất nhàm chán, vì nó chỉ làm những gì toán tử gán ngầm định có thể):
SomeClass& operator=(const SomeClass& rhs)
{
x = rhs.x;
return *this;
}
Trên thực tế, tuy nhiên, bạn phải hãy cẩn thận về sự an toàn ngoại lệ trong các tình huống như thế này, dẫn đến những thứ như thành ngữ sao chép và hoán đổi phổ biến để thực hiện các toán tử gán. Xem ở đây:
http://en.wikibooks.org/wiki/More_C++_Idioms/Copy-and-swap
gì bạn gọi là "chuyển nhượng" là thực sự gọi là "khởi tạo", và những gì bạn gọi là "sao chép" được gọi là "chuyển nhượng". – Philipp
'SomeClass a();' - Đó là một khai báo hàm. –
Có thể trùng lặp: http://stackoverflow.com/questions/5368258/the-copy-constructor-and-assignment-operator –