Khởi tạo mảng C ++


80

Đây có phải là hình thức phức tạp hóa một mảng thành tất cả các số 0 không

char myarray[ARRAY_SIZE] = {0} được hỗ trợ bởi tất cả các trình biên dịch? ,

nếu vậy, có cú pháp tương tự với các loại khác? ví dụ

bool myBoolArray[ARRAY_SIZE] = {false} 

Tôi cá rằng tiền tốt falsecũng giống như 0(nếu không if(false)sẽ không đánh giá là sai), vì vậy những gì bạn có có thể sẽ hoạt động trên 99% trình biên dịch. Không thể chắc chắn về 1% còn lại cho đến khi chúng tôi trích dẫn tiêu chuẩn.
Chris Lutz

Tôi biết rằng trong C, int a[10] = { 1, 2, 3 };sẽ được đặt a[3]..a[9]thành 0, ("được khởi tạo ngầm giống như các đối tượng có thời lượng lưu trữ tĩnh"). Điều này có đúng với C ++ không?
Alok Singhal

5
Có, nó có. Nếu nó không đúng với C ++ thì C ++ sẽ không được thậm chí từ xa tương thích ngược với C.
Chris Lutz

2
falsekhông giống như 0, nhưng trong {0}số 0 được chuyển đổi thành false, và trong (đối với C ++), {}bạn thậm chí không phải quan tâm đến các chuyển đổi: Nó được khởi tạo thành falsehoặc 0hoặc null-pointer hoặc bất kỳ mặc định phân biệt kiểu nào khác.
Johannes Schaub - litb 17/12/09

Câu trả lời:


139

Có, hình thức khởi tạo này được hỗ trợ bởi tất cả các trình biên dịch C ++. Nó là một phần của ngôn ngữ C ++. Trên thực tế, nó là một thành ngữ đến từ C ++ từ ngôn ngữ C. Trong ngôn ngữ C = { 0 }là một bộ khởi tạo số 0 phổ biến . Đây cũng là trường hợp gần như đúng trong C ++.

Vì initalizer này là phổ quát, đối với boolmảng, bạn không thực sự cần một "cú pháp" khác. 0cũng hoạt động như một trình khởi tạo cho boolloại, vì vậy

bool myBoolArray[ARRAY_SIZE] = { 0 };

được đảm bảo khởi tạo toàn bộ mảng với false. Cũng như

char* myPtrArray[ARRAY_SIZE] = { 0 };

trong đảm bảo khởi tạo toàn bộ mảng với kiểu con trỏ null char *.

Nếu bạn tin rằng nó cải thiện khả năng đọc, bạn chắc chắn có thể sử dụng

bool myBoolArray[ARRAY_SIZE] = { false };
char* myPtrArray[ARRAY_SIZE] = { nullptr };

nhưng vấn đề là = { 0 }biến thể cung cấp cho bạn một cách chính xác kết quả tương tự.

Tuy nhiên, trong C ++ = { 0 }có thể không hoạt động với tất cả các kiểu, ví dụ như kiểu enum, không thể khởi tạo bằng tích phân 0. Nhưng C ++ hỗ trợ dạng ngắn hơn

T myArray[ARRAY_SIZE] = {};

tức là chỉ là một cặp trống của {}. Điều này sẽ khởi tạo mặc định một mảng thuộc bất kỳ kiểu nào (giả sử các phần tử cho phép khởi tạo mặc định), có nghĩa là đối với các kiểu cơ bản (vô hướng), toàn bộ mảng sẽ được khởi tạo bằng 0 đúng cách.


8
và trong c ++ 0x, bạn sẽ có thể khởi tạo bất cứ thứ gì như thế này
jk.

4
Trên trình biên dịch của tôi (qt Creator 2.4.1 - qt phiên bản 4.8.0), nếu tôi viết bool myBoolArray[ARRAY_SIZE] = { false };mảng thì tất cả đều được khởi tạo thành false, nhưng nếu tôi viết bool myBoolArray[ARRAY_SIZE] = { true };chỉ phần tử đầu tiên được đặt thành true, trong khi mọi thứ khác là false. Bất kỳ lời giải thích?
tân binh lập trình viên

@rookie coder: Giải thích chính xác cho điều gì? Bạn mong đợi điều gì sẽ xảy ra? Trong C ++, nếu bạn khởi tạo một phần một boolmảng, phần còn lại được khởi tạo bằng 0 đối với bạn. Nó là như vậy.
AnT

1
@AndreyT Tốt thôi, nhưng tôi thấy hành vi này ít nhất là phản trực giác. Nếu tôi không khởi tạo, chẳng hạn như bool myBoolArray[ARRAY_SIZE];, mảng chứa các giá trị ngẫu nhiên một cách chính xác, do đó tôi sẽ không mong đợi rằng một lần khởi tạo có thể trả về một mảng có các giá trị khác nhau trong đó. Đó là tất cả.
tân binh lập trình viên

1
@AndreyT: chắc chắn, nhưng tôi chưa bao giờ nghĩ rằng trận tuyết lở sẽ khác với phần tử đầu tiên ;-) Dù sao, cảm ơn vì thông tin!
tân binh lập trình viên

18

Lưu ý rằng '=' là tùy chọn trong cú pháp khởi tạo phổ dụng C ++ 11 và nó thường được coi là kiểu viết tốt hơn:

char myarray[ARRAY_SIZE] {0}

0

Có, tôi tin rằng nó sẽ hoạt động và nó cũng có thể được áp dụng cho các loại dữ liệu khác.

Đối với mảng lớp, nếu có ít mục trong danh sách bộ khởi tạo hơn các phần tử trong mảng, thì hàm tạo mặc định sẽ được sử dụng cho các phần tử còn lại. Nếu không có phương thức khởi tạo mặc định nào được xác định cho lớp, thì danh sách bộ khởi tạo phải đầy đủ - nghĩa là phải có một bộ khởi tạo cho mỗi phần tử trong mảng.


-1

Bạn có thể khai báo mảng trong C ++ theo những cách này. Nếu bạn biết kích thước mảng thì bạn nên khai báo mảng cho: integer: int myArray[array_size]; Double: double myArray[array_size]; Char và string: char myStringArray[array_size]; Sự khác biệt giữa char và string như sau

char myCharArray[6]={'a','b','c','d','e','f'};
char myStringArray[6]="abcdef";

Nếu bạn không biết kích thước của mảng thì bạn nên để mảng trống như sau.

số nguyên: int myArray[array_size];

Gấp đôi: double myArray[array_size];

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.