2010-07-07 4 views
5

Tôi chỉ đọc một comment by GMan rằngCác trình khởi tạo trống có được ưu tiên cho việc khởi tạo mặc định các thành viên không tách rời không?

class A 
{ 
public: 
    A() : 
     m_ptr() // m_ptr is implicitly initialized to NULL 
    { } 
}; 

nên được ưa thích hơn

class A 
{ 
public: 
    A() : 
     m_ptr(NULL) // m_ptr is explicitly initialized to NULL 
    { } 
}; 

Thông báo việc thiếu NULL trong ví dụ đầu tiên.

GMan có đúng không? Điều này có thể mang tính chủ quan, vì vậy "Bạn có muốn khởi tạo trống để khởi tạo mặc định không?" có thể phù hợp hơn.

Ngoài ra nếu bạn thích công cụ khởi tạo trống, điều này có áp dụng cho các thành viên không tách rời khác không?

class B 
{ 
public: 
    B() : 
     m_count(), 
     m_elapsed_secs() 
    {} 
private: 
    std::size_t m_count; 
    float m_elapsed_secs; //the elapsed time since instantiation 
}; 

Tất nhiên, hãy bảo vệ quan điểm của bạn với mô tả lý do tại sao người ta nên ưa thích hơn người kia.

+0

Ai đó có thể sáng tạo hơn tôi đưa ra một tiêu đề tốt hơn để tôi ngừng nhận được câu trả lời sai? Ai có thể nghĩ rằng bạn * có thể * nhận được câu trả lời sai cho một câu hỏi thực hành tốt nhất. –

+2

Tôi nghĩ rằng tiêu đề là rõ ràng, và câu hỏi cũng được viết. Sau đó, một lần nữa, tôi đã biết những gì bạn đang hỏi về. Câu trả lời sai có lẽ chỉ là hiểu lầm của ngôn ngữ chứ không phải là câu hỏi của bạn. – GManNickG

Trả lời

7

tôi thích minh bạch. Như một số câu trả lời sai cho câu hỏi này đã chứng minh, nó không rõ ràng cho tất cả mọi người rằng, nói, int()int(0) là tương đương.

tôi giả sử không cung cấp một giá trị rõ ràng có ưu điểm là bạn sẽ không cần phải xem lại danh sách khởi tạo nếu bạn đêm trước r thay đổi loại.

+0

Bạn có thể tranh luận rằng không cần phải truy cập lại danh sách khởi tạo khi thay đổi kiểu là âm (khi init mặc định không còn là thứ bạn muốn cho kiểu mới). –

-1

Tôi nghĩ rằng họ là những thứ khác nhau, là nó có thể bạn đang bối rối NULL với void nghĩa int main() cũng giống như int main(void) nhưng KHÔNG int main(NULL) (Trong C++ NULL tương đương với 0

+2

Không có định nghĩa chức năng nào trong câu hỏi của tôi. Tôi hỏi về việc khởi tạo thành viên trong danh sách khởi tạo của lớp. –

2

Mặc định khởi tạo là cần thiết khi bạn viết một lớp mẫu để khởi tạo mặc định thành viên của các kiểu phụ thuộc. Đối với các trường hợp khác không có sự khác biệt thực sự nếu bạn muốn mặc định khởi tạo thành viên. Nhưng có một số trường hợp khi bạn muốn nhận được hành vi không mặc định.

Một mẫu khi khởi tạo mặc định là không phù hợp:

struct X { 
    HANDLE some_file_handle; 
    // note that INVALID_HANDLE_VALUE is not equal to 0 in Windows 
    X() : some_file_handle(INVALID_HANDLE_VALUE) {} 
}; 

Đối với sử dụng NULL vs khởi tạo mặc định Tôi có một ví dụ nữa: trong Visual Studio 2010 được tuyên bố là bằng cách nào đó tuân thủ QTI với 0x NULL C++ vẫn được định nghĩa là 0, nhưng trong C++ 0x bạn nên sử dụng nullptr để khởi tạo con trỏ. Và nullptr không được định nghĩa trong C++ '03. Nhưng bạn có thể muốn làm cho mã của bạn di động. Trong trường hợp đó (để khởi tạo con trỏ), tôi sẽ thích khởi tạo mặc định hơn khi khởi tạo giá trị.

2

Thứ nhất, tôi cho rằng điều đó được cho là tốt hơn, không phải là vậy. :) Ngoài ra, nó đã được thêm về việc loại bỏ NULL; Tôi chỉ xảy ra để sử dụng không có gì thay vì 0. Nhưng một câu hỏi thú vị anyway.

Nó có lẽ chỉ là vấn đề về phong cách, nhưng điều quan trọng cần lưu ý là as Johannes did, rằng nó không chỉ là kiểu cú pháp; họ làm những việc khác nhau. Nó chỉ là dễ dàng để làm cho những điều khác nhau như nhau.

Tôi thích khởi tạo giá trị hơn, vì tôi không tham gia bất kỳ phần nào của cách giá trị được khởi tạo; Tôi chỉ đơn giản nói "được khởi tạo". Ngược lại, một khi bạn giới thiệu một giá trị bạn đang ảnh hưởng đến cách giá trị được khởi tạo.

Tôi nghĩ bạn sẽ gặp khó khăn trong việc tìm ra một tình huống khi khởi tạo giá trị là rõ ràng hơn tốt hơn, chỉ cần chọn cái nào phù hợp với bạn nhiều hơn.

+0

Bạn có thích khởi tạo giá trị trong trường hợp 'lớp B' không? Đối với tôi, nó cảm thấy một chút lạ không khởi tạo một biến đếm đến 0. –

+2

Tôi nghĩ rằng GMan không nên trả lời câu hỏi "Là quyền GMan". Đó là một loại đệ quy nào đó. :) –

+0

@Caspin: Yup. Tôi chỉ cảm thấy thoải mái khi biết nó sẽ được khởi tạo đến 0 anyway, vì vậy tôi cảm thấy xác định các hằng số anyway chỉ là một sự lãng phí. :) Sau đó, một lần nữa, được rõ ràng có thể được dễ dàng hơn để đọc. – GManNickG