2010-06-01 36 views
7

Nói rằng tôi có một cấu trúc trông như thế này (một POD):Mặc định Struct khởi trong C++

struct Foo 
{ 
    int i; 
    double d; 
}; 

sự khác nhau giữa hai dòng sau là gì:

Foo* f1 = new Foo; 
Foo* f2 = new Foo(); 
+0

Lưu ý câu hỏi liên quan [Tại sao lỗi khi sử dụng tập hợp dấu ngoặc trống để gọi hàm tạo không có đối số?] (Http://stackoverflow.com/questions/180172/why-is-it-an- error-to-use-an-empty-set-of-dấu ngoặc vuông-to-call-a-constructor-with-no). – Troubadour

Trả lời

12

Cái đầu tiên để lại các giá trị uninitialised; thứ hai khởi tạo chúng bằng không. Đây chỉ là trường hợp đối với các loại POD, không có nhà thầu.

+0

Cảm ơn bạn! Đó có phải là khác biệt duy nhất không? – criddell

+5

Vâng, đó là sự khác biệt duy nhất. –

+0

Và nếu tôi không nhầm, điều này chỉ được thêm vào trong một số phiên bản mới hơn của tiêu chuẩn (2003?) – Suma

-2

mỗi liên kết Tôi đã đăng.

Trong C++ sự khác biệt duy nhất giữa một lớp và cấu trúc là thành viên lớp là riêng tư theo mặc định, trong khi cấu trúc thành viên mặc định công khai. Vì vậy, các cấu trúc có thể có các hàm tạo và cú pháp giống như đối với các lớp.

Struct Constructor Info

+1

Vấn đề là sử dụng hoặc bỏ sót các dấu ngoặc cong khi xây dựng các đối tượng mới. Câu hỏi áp dụng cho các lớp cũng như cấu trúc. – Troubadour

1

Tôi cho rằng không có gì cả. Foo() được cho phép, ngay cả khi nó không có ý nghĩa ... Tôi đã cố gắng thay đổi struct thành class và thử một sự khác biệt trên exe được tạo ra, và kết quả là giống nhau, có nghĩa là một lớp không có phương pháp giống như một cấu trúc từ một quan điểm thực tế và "hiệu quả".

Nhưng: nếu bạn chỉ sử dụng một của phương án, giữ struct hoặc class dù, nó sẽ xảy ra rằng new Foonew Foo() mang đến cho thực thi mà khác nhau! (Ít nhất bằng cách sử dụng g ++) I.e.

 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo; delete f1; } 

được biên dịch vào somehing khác nhau từ

 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo(); delete f1; } 

và tương tự xảy ra với class thay vì struct. Để biết sự khác biệt là chúng ta nên nhìn vào mã được tạo ra ... và để biết nếu nó là một g ++ idiosincracy hay không, tôi nên thử một trình biên dịch nhưng tôi chỉ có gcc và không có thời gian để phân tích đầu ra asm của g + +. ..

Dù sao từ quan điểm "chức năng" (thực tế), nó cũng giống nhau.

Thêm

Cuối cùng nó luôn luôn là tốt hơn để biết hay làm điều tra sâu hơn đối với một số vấn đề chung của nhân loại trên các trang web Q/A ... sự khác biệt duy nhất trong mã được tạo ra bởi g ++ trong() và không có() trường hợp,

 
    movl $0, (%eax) 
    fldz 
    fstpl 4(%eax) 

mà là một đoạn mà khởi 0/0.0 int và double của struct ... do đó, Seymour biết nó tốt hơn (nhưng tôi có thể đã phát hiện ra nó mà không biết nếu tôi có hãy nhìn vào asm trước!)

+0

Tại sao việc sử dụng dấu ngoặc đơn không có ý nghĩa, nó sẽ gọi hàm tạo mặc định. Nếu bất cứ điều gì, một thiếu parens không có ý nghĩa. – Salgar

+0

bạn đang nói gì vậy? đó là một thử nghiệm, chính đáng cho câu hỏi và thực tế là foo() thường có nghĩa là một cuộc gọi đến một hàm/phương pháp; một bài kiểm tra không hữu ích, chứ không phải là đọc thông số kỹ thuật, điều này có thể là một phê bình có thể. Nhận xét của bạn không có ý nghĩa gì đối với tôi. – ShinTakezou

Các vấn đề liên quan