2010-02-22 28 views
9

Tôi muốn xây dựng một đối tượng trong ngăn xếp, sử dụng C++. Bạn có biết sự khác biệt giữa các đến cách gọi constructor (có và không có ngoặc) là gì:Các cách khác nhau để xây dựng một đối tượng trong C++

một) MyClass object ;

b) MyClass object() ;

Tôi đang sử dụng MFC và khi xây dựng biến toàn cục cho ứng dụng chính, nếu tôi sử dụng cách thứ hai, tôi có ngoại lệ, tôi nghĩ hai cách này tương đương nhau.

Cảm ơn mọi người vì bất kỳ thông tin nào.

+0

cách hàm tạo cho MyClass trông như thế nào? –

+0

Tôi sẽ không nghĩ rằng bạn sẽ nhận được một ngoại lệ với (b). Điều này sẽ dẫn đến lỗi biên dịch. – LeopardSkinPillBoxHat

Trả lời

18

Đây là một trong những gotchas của C++.

MyClass object(); 

là cách mà một hàm nguyên mẫu được định nghĩa trong C++, vì vậy trình biên dịch nghĩ rằng bạn đang cố gắng để khai báo chức năng khác ở giữa chức năng khác.

Nếu bạn muốn gọi constructor mặc định (tức là điều không có đối số), sử dụng cú pháp này để thay thế:

MyClass object; 

Xem thêm câu trả lời Garth Gilmour cho câu hỏi bây giờ xóa What is your (least) favorite syntax gotcha?:

Trong C++

Employee e1("Dave","IT"); //OK 
Employee e2("Jane"); //OK 
Employee e3(); //ERROR - function prototype 
+2

Trình khởi tạo '()' trong C++ không nhất thiết là lời gọi hàm khởi tạo mặc định. Trình khởi tạo '()' thực hiện khởi tạo giá trị không tương đương với lời gọi hàm tạo mặc định, tức là biểu mẫu cuối cùng (không có '()') không tương đương với ý định được biểu diễn trong bước đầu tiên. Cách thích hợp để khắc phục vấn đề "nguyên mẫu" là sử dụng cú pháp khởi tạo sao chép 'MyClass object = MyClass()' và hy vọng trình biên dịch sẽ dịch nó thành mã hiệu quả. – AnT

+0

@ David: bạn nói đúng và tôi đang xóa nhận xét của mình –

8

Ví dụ:

class MyClass 
{ 
    public: 
    MyClass() 
    {x = 0;} 
    MyClass(int X) 
    {x = X;} 
    private: 
    int x; 
}; 

int main() 
{ 
    MyClass myObject(56); // initialize x to value '56' 
    MyClass myObject2; //calls default constructor and initializes x to 0 
    return 0; 
} 
Các vấn đề liên quan