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();
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();
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.
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.
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
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 Foo
và new 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!)
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
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
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