2012-04-11 30 views
7

int a = int(); nhất thiết phải cung cấp cho tôi số không?Có phải "int a = int();" nhất thiết phải cho tôi một số không?

Làm thế nào nếu int được thay thế bằng char, double, bool hoặc loại con trỏ?

Địa chỉ này được chỉ định ở tiêu chuẩn ngôn ngữ ở đâu?

+0

thể trùng lặp của [? Làm constructor mặc định tích hợp sẵn trong các loại có] (http : //stackoverflow.com/questions/5113365/do-built-in-types-have-default-constructors) – Kaz

Trả lời

17

Có phải int a = int(); nhất thiết phải cho tôi bằng không?

Có, tiêu chuẩn đảm bảo rằng nó cung cấp cho bạn 0.
Điều này được gọi là Giá trị khởi tạo. Đối với loại int, Khởi tạo giá trị về cơ bản sẽ kết thúc là Zero Initialization.

Trường hợp này được quy định trong tiêu chuẩn ngôn ngữ ở đâu?

Các quy tắc được quy định rõ ràng trong tiêu chuẩn trong phần 8,5. Tôi sẽ trích dẫn những người liên quan đến Q ở đây:

C++ 03: 8,5 Initializers
Para 7:

Một đối tượng có initializer là một tập rỗng ngoặc, tức là,(), sẽ được khởi tạo giá trị.

Giá trị khởi & Zero, khởi được định nghĩa trong 8,5 Para 5 như:

Để giá trị khởi tạo một đối tượng kiểu T có nghĩa là:

- nếu T là một loại lớp (điều 9) với một hàm tạo do người dùng khai báo (12.1), sau đó hàm khởi tạo mặc định cho T được gọi (và khởi tạo bị hỏng nếu T không truy cập được hàm tạo mặc định);
- nếu T là một loại không phải là công đoàn mà không có một hàm tạo do người dùng khai báo, thì mỗi thành phần dữ liệu không thành phần và thành phần cơ bản của T được khởi tạo giá trị;
- nếu T là một loại mảng, thì mỗi phần tử được khởi tạo giá trị;
- cách khác, đối tượng được zero-khởi

Để zero-khởi một đối tượng kiểu T có nghĩa là:

- nếu T là một kiểu vô hướng (3.9), đối tượng được đặt thành giá trị 0 (không) được chuyển thành T;
- nếu T là loại nhóm không phải là công đoàn, mỗi thành viên dữ liệu phi tuyến tính và từng lớp con cấp cơ sở
không được khởi tạo;
- nếu T là loại liên kết, thành viên dữ liệu được đặt tên đầu tiên của đối tượng là không được khởi tạo;
- nếu T là một loại mảng, mỗi phần tử không được khởi tạo;
- nếu T là kiểu tham chiếu, thì không khởi tạo được thực hiện.

Lưu ý: Các văn bản in đậm được nhấn mạnh bởi tôi.

+0

Và có một đoạn khác ở đâu đó mà nó giải thích rằng khởi tạo giá trị cho 'int' có nghĩa là khởi tạo' 0' .. – juanchopanza

+0

@juanchopanza: Nếu bạn làm theo văn bản in đậm trong các trích dẫn chuẩn ở trên, Bạn sẽ thấy cách nói đến điều đó. –

+0

Tôi biết rằng, văn bản không có ở đó khi tôi viết nhận xét. Gần đây tôi đã đi qua điều này trong c + + 11 cố gắng tìm ra '{}' khởi tạo :) – juanchopanza

0

Có, mọi loại được cài sẵn luôn được khởi tạo bằng 0 khi được khởi tạo mặc định. Hãy ghi nhớ rằng trong hầu hết các tình huống một built-in loại là không mặc định khởi tạo vì vậy đây sẽ không nhất thiết phải in ra 0:

int i; 
std::cout << i << "\n"; 
Các vấn đề liên quan