Khi tôi đọc về hàm tạo bản sao và sao chép hàm tạo phân công, điều tôi nhận được là cả hai đều cho phép các thuộc tính của chúng đến nhau. Và, cả hai đều được khai báo ngầm bởi trình biên dịch (nếu không được định nghĩa). Vì vậy, cả hai phải tồn tại, cho dù làm một cái gì đó hữu ích hay không.Khi nào nhà điều hành gán bản sao được gọi?
Sau đó, tôi đã kiểm tra mã này:
#include <iostream>
using namespace std;
class Test {
public:
Test() {
cout << "Default constructor" << endl;
}
Test (const Test& empty) {
cout << "Copy constructor" << endl;
}
Test& operator=(const Test& empty) {
cout << "Copy assignment operator" << endl;
}
private:
};
int main() {
Test a; // Test default constructor
Test b (a); // Test copy constructor
Test c = b; // Test copy assignment constructor
system ("pause");
return 0;
}
Nhưng có vẻ như toán tử gán bản sao không được gọi là gì cả. Tôi đã thử với ba điều kiện:
Mọi thứ được bao gồm. Bản in ra:
// Default constructor // Copy constructor // Copy constructor # Why not prints out "Copy assignment operator"?
Toán tử gán bản sao trắng chỉ sao chép hàm tạo. Bản in ra:
// Default constructor // Copy constructor // Copy constructor # Why it's printed out even though I didn't define it?
Trình tạo bản sao ẩn chỉ sao chép toán tử gán. Nó in ra:
// Default constructor # Why "Copy assignment operator" is not printed out?
Chỉ hàm tạo. Nó in ra:
// Default constructor # Understandable
Vì vậy, nó giống như trình biên dịch thậm chí không quan tâm nếu tôi xác định toán tử gán bản sao hay không. Không ai trong số bốn ví dụ trên in ra "Sao chép toán tử gán". Và như vậy, khi nó được gọi là nếu nó thực sự tồn tại và có một ý nghĩa?
'c' là đối tượng mới sao cho nó sao chép constrcut – billz