2012-09-08 39 views
8

Khi bạn khởi tạo một vector theo cách sau:C++ Tại sao khởi tạo vector gọi là bản sao constructor

std::vector<MyClass> MyVec(10); 

Nó kêu gọi các nhà xây dựng mặc định một lần và sau đó gọi các nhà xây dựng bản sao thêm 10 lần. Vì vậy, nếu tôi hiểu nó một cách chính xác, các đối tượng trong vectơ là tất cả được thực hiện bởi các nhà xây dựng bản sao.

Ai đó có thể giải thích lý do gọi cho người tạo bản sao chứ không phải là người mặc định? Hoặc thậm chí chỉ phân bổ bộ nhớ mà không có các đối tượng?

+0

RE cấp phát bộ nhớ mà không cần xây dựng đối tượng: Sau đó, bạn không thể thực sự sử dụng nó. Ngay cả toán tử gán cũng có thể yêu cầu thứ gì đó mà các nhà xây dựng thiết lập. Tất nhiên, chỉ cần đặt trước cũng có thể có ý nghĩa, nhưng nó sẽ có ngữ nghĩa rất khác nhau. – delnan

+1

[Bài kiểm tra của tôi] (http://liveworkspace.org/code/b831cffa5df38a6b12c8a637de815573) cho thấy hàm tạo mặc định được gọi là mười lần. – chris

+1

Hành vi này đã thay đổi trong C++ 11, nơi có thể khởi tạo giá trị của mỗi thành viên. –

Trả lời

15

Nó sẽ phân bổ bộ nhớ mà không cần đối tượng, ngoại trừ việc bạn đã chỉ định một kích thước ban đầu là 10, vì vậy nó có để tạo ra 10 đối tượng. Nếu bạn muốn bộ nhớ cho 10 đối tượng mà không thực sự tạo ra chúng, bạn có thể làm điều gì đó như:

std::vector<MyClass> MyVec; 
MyVec.reserve(10); 

Nếu bạn nhìn chữ ký của các nhà xây dựng bạn đang sử dụng là một cái gì đó như:

vector(size_t num, T initial_value = T()); 

Đó hãy bạn vượt qua một giá trị để sử dụng để điền vào các điểm mà bạn yêu cầu nó tạo. Nếu bạn không chỉ định một giá trị, nó sẽ tạo một giá trị (với ctor mặc định) để chuyển tới ctor, và sau đó tạo các bản sao của nó trong chính vectơ đó.

Không có câu hỏi thực sự rằng có thể làm những việc khác, nhưng cung cấp sự cân bằng hợp lý giữa tính đơn giản (không chỉ định giá trị), tính linh hoạt (chỉ định giá trị nếu bạn muốn) và kích thước mã (tránh trùng lặp) toàn bộ ctor chỉ để mặc định xây dựng nội dung).

+0

Thực tế chữ ký là 'vector rõ ràng (size_type count)', do đó, giá trị mặc định "seed" được tạo bên trong. – Rost

+0

@Rost, Từ tìm kiếm, có vẻ như nó đã được thay đổi thành điều đó trong C++ 11. Câu hỏi là về mặt kỹ thuật một trường hợp C++ 03, như tôi đã phát hiện ra một phút trước. – chris

+1

Đây là vấn đề của C++ 03 so với C++ 11. Trong C++ 03, bạn có 'vector (size_t count, T const & value = T())' và trong C++ 11, bạn có 'vector (size_t count)' và 'vector (size_t count, T const & giá trị) '. Chú ý sự khác biệt. – Nawaz

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