2012-07-30 43 views
29
// Method One 
class ClassName 
{ 
public: 
    ClassName() : m_vecInts() {} 

private: 
    std::vector<int> m_vecInts; 
} 

// Method Two 
class ClassName 
{ 
public: 
    ClassName() {} // do nothing 

private: 
    std::vector<int> m_vecInts; 
} 

Câu hỏi> Cách chính xác để khởi tạo biến thành viên vectơ của lớp là gì? Chúng ta có phải khởi tạo nó không?Cách đúng để khởi tạo biến thành viên vectơ

+1

Không, trừ khi bạn muốn chỉ định dung lượng ban đầu (hoặc khởi tạo nội dung của nó mà bạn có thể làm với các danh sách khởi tạo trong C++ 11 hoặc 'list_of' I _think_) của boost. – hmjd

+2

Véc tơ của cả hai chiều được tạo bằng cách sử dụng hàm tạo mặc định, nhưng ưu tiên thứ nhất là –

+1

@ Mr.Anubis: Không phải bởi tôi. –

Trả lời

21

Xem http://en.cppreference.com/w/cpp/language/default_initialization

Mặc định khởi được thực hiện trong ba tình huống:

  1. khi biến có thời lượng lưu trữ tự động được khai báo không có bộ khởi tạo
  2. khi đối tượng có thời lượng lưu trữ động được tạo bởi biểu thức mới mà không có initializer
  3. khi lớp cơ sở hoặc thành phần dữ liệu không tĩnh không được đề cập trong danh sách khởi tạo hàm tạo và hàm tạo đó được gọi là.

Ảnh hưởng của khởi tạo mặc định là:

  • Nếu T là một loại lớp, các nhà xây dựng mặc định được gọi là để cung cấp các giá trị ban đầu cho các đối tượng mới.
  • Nếu T là một loại mảng, mọi phần tử của mảng được khởi tạo mặc định.
  • Nếu không, không có gì được thực hiện.

là loại lớp mà hàm tạo mặc định của nó được gọi. Vì vậy, khởi tạo thủ công là không cần thiết.

+0

bất ngờ với tôi rằng 'lớp T2 { int mem; công khai: T2() {} // "mem" không có trong danh sách khởi tạo }; '' const T2 t2; // ok, gọi hàm ctor mặc định do người dùng cung cấp // t2.mem được khởi tạo mặc định' – q0987

+0

Tôi vừa kiểm tra mã ở trên trong VS2010 và nó là WRONG. t2.mem KHÔNG được khởi tạo mặc định! – q0987

+1

@ q0987: 'mem' là một' int', nó không phải là một lớp, cũng không phải là một loại mảng, vì vậy nó sẽ không được khởi tạo mặc định. Mã được cung cấp trên cppreference hầu như luôn luôn được xác nhận theo tiêu chuẩn C++ 11, nhưng tôi không biết liệu điều này có thay đổi bất cứ điều gì cho trường hợp đã cho hay không (được cho là 'const' qualifier). Tuy nhiên, ngay cả khi ví dụ này là \t không nhất quán và thậm chí có thể sai, giải thích và tiêu chuẩn của chính nó thì không. – Zeta

1

Bạn không phải khởi chạy nó một cách khéo léo, nó sẽ được tạo khi bạn tạo một thể hiện của lớp học.

17

Điều đó tùy thuộc. Nếu bạn muốn có một vector 0 kích thước, thì bạn không phải làm gì cả. Nếu bạn muốn, chẳng hạn, một kích thước N vector điền của 42s sau đó sử dụng danh sách constructor khởi tạo:

ClassName() : m_vecInts(N, 42) {} 
Các vấn đề liên quan