2015-03-19 13 views
6

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:

  1. Mọi thứ được bao gồm. Bản in ra:

    // Default constructor 
    // Copy constructor 
    // Copy constructor # Why not prints out "Copy assignment operator"? 
    
  2. 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? 
    
  3. 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? 
    
  4. 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?

+2

'c' là đối tượng mới sao cho nó sao chép constrcut – billz

Trả lời

12

Test c = bkhởi tạo, không phải bài tập.

Nếu bạn đã làm điều này:

Test c; 
c = b; 

Sau đó, nó đã có thể gọi toán tử gán bản sao.

+0

Điều này có nghĩa là' Test c (b) 'và' Test c = b' giống hệt nhau không? –

+5

@ AndreasVennström Không, chúng không giống nhau. Cả hai đều có cùng tác dụng trong mã này, nhưng chúng là hai kiểu khởi tạo khác nhau. Xem http://bit.ly/1FLauIT và đọc về khởi tạo trực tiếp và sao chép. – 0x499602D2

Các vấn đề liên quan