Vâng, bản gốc const int b[10];
chỉ hữu ích khi bạn có thể khởi tạo mảng, do đó cả hai ví dụ std::array
không hoạt động trong thực tế.
1:
std::array<const int, 10> c;
Đây là gần gũi nhất với const int c[10];
. Vấn đề là sẽ không có constructor mặc định cho nó, và bởi vì các phần tử không thể thay đổi được, nên nó không có giá trị để sử dụng nó. Bạn phải cung cấp một số khởi tạo cho nó trong hàm tạo. Như là, nó sẽ cung cấp cho một lỗi biên dịch bởi vì các nhà xây dựng mặc định đã không khởi tạo các yếu tố.
Mã này có nghĩa là c
có thể thay đổi, nhưng bản thân các phần tử thì không. Tuy nhiên, trên thực tế, không có đột biến nào trên c
không ảnh hưởng đến các yếu tố.
2:
const std::array<int, 10> d;
Điều này có nghĩa d
là không thể thay đổi, nhưng các yếu tố của thể thay đổi loại int
. Bởi vì const
sẽ truyền cho các thành viên, điều đó có nghĩa là các yếu tố vẫn không thể thay đổi được bởi người gọi. Tương tự như ví dụ trên, bạn cần phải khởi tạo d
vì đó là const
.
Trong thực tế, cả hai sẽ hoạt động tương tự liên quan đến tính đột biến, bởi vì các hoạt động có thể thay đổi trên array
luôn chạm vào các phần tử.
+1 mặc dù mảng tĩnh không bao giờ được phân bổ trên ngăn xếp. Một mảng size_fixed có thể được cấp phát trên stack (tự động lưu trữ declspec) hoặc trong một phân đoạn dữ liệu toàn cục (static storage declspec). Thông tin bên lề: trong 'typedef int ints_t [10]; ints_t * ints = new ints_t(); 'là' ints' một mảng kích thước cố định hoặc một mảng động? – sehe
Cả hai mảng yêu cầu khởi tạo khi được khai báo. IMHO, không có sự khác biệt giữa hai - chúng chính xác giống nhau từ một quan điểm thuật toán và sử dụng (thực tế, các trình lặp là như nhau; 'const int *'). Thành thật mà nói cách tốt nhất để khai báo là như bạn nói trong câu trả lời, 'const std :: mảng c;' Điều này làm cho nó rất cụ thể, một mảng const của const ints. –
Nim