"Tôi hiểu rằng Set chỉ là một con trỏ đến mảng tĩnh của 10 số nguyên"
Không, đó là sai: nó là một mảng, không phải là một con trỏ.
Bạn vẫn có thể khởi tạo nó trong danh sách bộ khởi tạo của hàm tạo.
Đối với một trình biên dịch mà không hỗ trợ C++ 11 dấu ngoặc nhọn khởi (Visual C++ phiên bản 11 và trước đó nói đến cái tâm), bạn sẽ phải nhảy qua một số hoops mặc dù, như hình dưới đây:
#include <iostream>
#include <vector>
using namespace std;
#define CPP11
#if defined(_MSC_VER)
# if (_MSC_VER <= 1700)
# undef CPP11
# endif
#endif
#ifdef CPP11
class Cpp11
{
private:
int set_[10];
public:
Cpp11()
: set_{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
{}
int foo() const { return set_[3]; }
};
#endif
class Cpp03
{
private:
struct IntArray10 { int values[10]; };
IntArray10 set_;
static IntArray10 const& oneToTen()
{
static IntArray10 const values =
{ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} };
return values;
}
public:
Cpp03()
: set_(oneToTen())
{}
int foo() const { return set_.values[3]; }
};
int main()
{}
Thay vì sử dụng mảng thô, mặc dù, sử dụng std::vector
và C+++ 11 std::array
, cả hai đều được hỗ trợ ngay cả bằng Visual C++ 11.
Nguồn
2012-08-06 23:07:33
Đối với giá trị, 'Đặt' không chỉ là con trỏ đến mảng các số nguyên '10', cũng không phải là' tĩnh' ở đây. Thay vào đó, tên mảng 'Set' phân rã thành con trỏ tới phần tử đầu tiên của mảng trong các tình huống nhất định. Sự khác biệt có thể được nhìn thấy rõ ràng bằng cách sử dụng 'sizeof' - tức là' sizeof (Set) == 10 * sizeof (int)! = Sizeof (int *) '. –
@StuartGolodetz Cảm ơn bạn đã làm rõ. Khi tôi nói tĩnh, tôi có nghĩa là tĩnh trong các hình thức mà nó được lưu trữ với các đối tượng/dụ, và không chỉ ở một nơi khác trong heap. Tất nhiên, đó là một sự lạm dụng toàn bộ thuật ngữ 'tĩnh' trên một phần của tôi; lấy làm tiếc. – Serge
Đừng lo lắng :) Tôi chủ yếu chỉ cố gắng làm rõ sự khác biệt giữa mảng và con trỏ trên cơ hội không có khả năng có một sự hiểu lầm ở đó. –