Có quy tắc hay không để quyết định thời điểm sử dụng cú pháp cũ ()
thay vì cú pháp mới {}
?Khởi tạo đồng bộ trong C++ 0x, khi nào nên sử dụng() thay vì {}?
Để khởi tạo một cấu trúc:
struct myclass
{
myclass(int px, int py) : x(px), y(py) {}
private:
int x, y;
};
...
myclass object{0, 0};
Bây giờ trong trường hợp của một vector
ví dụ, nó có nhiều nhà xây dựng. Bất cứ khi nào tôi làm như sau:
vector<double> numbers{10};
tôi nhận được một vector của yếu tố thay vì một với yếu tố là một trong những nhà xây dựng là:
explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator());
nghi ngờ của tôi là bất cứ khi nào một lớp định nghĩa một constructor initializer list
như trong trường hợp của một vector, nó được gọi với cú pháp {}
.
Vì vậy, đó là những gì tôi đang suy nghĩ chính xác. tức là Tôi có nên hoàn nguyên về cú pháp cũ chỉ khi nào một lớp định nghĩa một hàm tạo danh sách khởi tạo để gọi một hàm tạo khác không? ví dụ: để sửa đoạn code trên:
vector<double> numbers(10); // 10 elements instead of just one element with value=10
Điều đó có nghĩa là người dùng có thể phá vỡ một lớp khách hàng khi thêm các nhà xây dựng danh sách khởi tạo không? Ouch. –
Không, hàm tạo khởi tạo không ảnh hưởng đến các hàm tạo khác tại chỗ AFAIK. –
@dribeas: Điều đó có chắc chắn không. Giả sử lớp của bạn ban đầu có một hàm tạo lấy một đối số int duy nhất và bạn vui vẻ tạo các cá thể bằng cú pháp mới. Nếu một hàm tạo mới được thêm vào có 'initializer_list', thì không phải tất cả các đối tượng này hiện đang sử dụng hàm tạo bổ sung chưa? Trừ khi các ví dụ trên mạng đã lỗi thời và tuyên bố một vectơ có danh sách nên thực tế trông giống như 'vector v {{2, 1}}; 'Tôi không thấy các dấu ngoặc ở bất kỳ đâu. –
UncleBens