2012-07-22 47 views
31

Hãy xem xét các chương trình dưới đây:Tại sao hàm tạo chỉ được gọi một lần?

class A 
{ 
    public: 
    A(int i) 
    { 
      cout<<"Called"<<endl; 
    } 
}; 

int main() 
{ 
    vector<A> v(5,A(1)); 
    return 0; 
}  

Tôi nhận được kết quả: http://ideone.com/81XO6

Called 

Tại sao các nhà xây dựng được gọi duy nhất một lần ngay cả khi chúng ta đang xây dựng 5 đối tượng?
Làm thế nào vector được xử lý nội bộ bởi trình biên dịch?

+7

Các thiết bị khác được khởi tạo bởi trình tạo bản sao. – jxh

+7

http://ideone.com/lHX5W –

+1

@Benjamin Lindley: bạn nên viết điều đó trong câu trả lời – nico

Trả lời

39

Lớp học của bạn có hai hàm tạo và bạn chỉ đang xem một trong số chúng. std::vector tạo các yếu tố của nó bằng cách sao chép-xây dựng chúng từ yếu tố nguyên bản gốc bạn đã cung cấp. Vì mục đích đó, hàm tạo bản sao của lớp A được gọi là 5 lần trong ví dụ của bạn.

Trình tạo bản sao cho A trong ví dụ của bạn được khai báo và định nghĩa rõ ràng bởi trình biên dịch. Nếu bạn muốn, bạn có thể tự khai báo và định nghĩa nó. Nếu bạn in một cái gì đó từ nó, bạn sẽ thấy rằng nó được gọi là ít nhất 5 lần.

+0

Giả sử không có thay đổi kích thước, nó sẽ là 5 lần hoặc chỉ 4 lần? Bản gốc có được sử dụng không? – Mysticial

+3

@Mysticial: Tôi không mong đợi bất kỳ trình biên dịch nào có thể sử dụng trực tiếp bản gốc. Làm sao? Các phần tử được lưu trữ trong một khối bộ nhớ động, được cấp phát * sau * phần tử gốc được xây dựng. Vì vậy, tất cả 5 yếu tố phải được sao chép từ bản gốc. – AnT

+0

Bây giờ tôi nghĩ về nó, bạn nói đúng vì nó nằm trong phạm vi sai. – Mysticial

12

Nó được gọi là một lần kể từ khi dòng

vector<A> v(5,A(1)); 

sẽ gọi các nhà xây dựng và dòng trở thành vector v (5, X);

trong đó X là đối tượng được tạo sau khi gọi hàm tạo.

Sau đó, hàm tạo bản sao được sử dụng.

Hãy thử thêm

A(const &A); 

Để khai báo lớp để xác minh điều này.

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