2015-10-17 14 views
8

tôi đọc this link của Stroustrup với đoạn mã sau:constructors Delegating trong C++() hoặc {}

class X { 
     int a; 
    public: 
     X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); } 
     X() :X{42} { } 
     X(string s) :X{lexical_cast<int>(s)} { } 
     // ... 
    }; 

Câu hỏi của tôi là về dòng:

X() X{42}{}

Có sự khác nhau giữa dấu ngoặc đơn và dấu ngoặc nhọn?
Nếu không có sự khác biệt, tôi có thể sử dụng dấu ngoặc nhọn trong các cuộc gọi chức năng khác không? Hoặc là nó chỉ trong đoàn đại biểu xây dựng? Và cuối cùng Tại sao chúng ta nên có cả hai cú pháp? Đó là một chút mơ hồ.

+1

"tôi có thể sử dụng dấu ngoặc nhọn trong các hàm khác cũng được gọi hay chỉ trong ủy quyền hàm tạo?" - Phái đoàn xây dựng không phải là một cuộc gọi chức năng. Bạn không bao giờ có thể sử dụng '{}' với các cuộc gọi hàm. – emlai

+0

kiểm tra điều này: http://stackoverflow.com/questions/18222926/why-is-list-initialization-using-curly-braces-better-than-the-alternatives –

Trả lời

7

() sử dụng value initialization nếu dấu ngoặc đơn trống hoặc direct initialization nếu không trống.

{} sử dụng list initialization, ngụ ý value initialization nếu niềng răng trống hoặc aggregate initialization nếu đối tượng được khởi tạo là tổng hợp.

X của bạn là đơn giản int, không có sự khác biệt giữa việc khởi tạo nó với () hoặc {}.

+0

Nếu tôi hiểu đúng nghĩa là nếu tôi đang in ấn 'X(): X (42) {} 'sau đó tôi gọi hàm tạo inte nhưng nếu tôi đang viết' X(): X {42} {} 'thì tôi chỉ đang khởi tạo các biến memebr mà không gọi một hàm tạo khác? – Govan

+0

@Govan - các kiểu nguyên thủy như 'int' và' double' không phải là các đối tượng chính thức. Họ không có nhà thầu. –

+0

@DavidHammen Tôi có nghĩa là X (int constructor) không phải nguyên thủy int constructior – Govan

0

Giá trị khởi tạo có thể được chỉ định bằng dấu ngoặc đơn hoặc dấu ngoặc đơn.

Niềng răng khởi tạo đã được giới thiệu với C++ 11 và nó có nghĩa là "khởi tạo đồng bộ" có thể được sử dụng cho tất cả các biến không tĩnh.

Niềng răng có thể được sử dụng ở vị trí dấu ngoặc đơn hoặc dấu bằng và được giới thiệu để tăng tính đồng nhất và giảm sự nhầm lẫn.

Đây chỉ là cấu trúc cú pháp và không dẫn đến lợi ích hoặc hình phạt về hiệu suất.

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