2010-02-18 20 views
5

điều Tò mò với g ++ (có thể cũng với trình biên dịch khác?):C++ phân bổ trên stack hành động một cách tò mò

struct Object { 
     Object() { std::cout << "hey "; } 
     ~Object() { std::cout << "hoy!" << std::endl; } 
}; 

int main(int argc, char* argv[]) 
{ 
     { 
       Object myObjectOnTheStack(); 
     } 
     std::cout << "===========" << std::endl; 
     { 
       Object(); 
     } 
     std::cout << "===========" << std::endl; 
     { 
       Object* object = new Object(); 
       delete object; 
     } 
} 

Compied với g ++:

=========== 
hey hoy! 
=========== 
hey hoy! 

Loại thứ nhất là phân bổ không xây dựng đối tượng. Tôi đang thiếu gì?

Trả lời

12

Loại đầu tiên của xây dựng không thực sự xây dựng đối tượng. Để tạo một đối tượng trên stack bằng cách sử dụng constructor mặc định, bạn phải bỏ qua 's

Object myObjectOnTheStack; 

phong cách hiện tại của bạn định nghĩa () thay vì khai báo một hàm có tên myObjectOnTheStack mà trả về một Object.

+0

Hãy thử 'Object myObjectOnTheStack; 'tức là nếu không có sự'() ' – Justicle

+0

@Jerry, nhờ tôi sửa chữa các thuật ngữ – JaredPar

+4

... "thay vì * tuyên bố * một chức năng" ... – Potatoswatter

4

Một ví dụ khác về "phân tích cú pháp gây tranh cãi nhất". Thay vì xác định một đối tượng, bạn đã khai báo một hàm có tên là myObjectOnTheStack, không có đối số và trả về một Object.

2
Object myObjectOnTheStack(); 

là khai báo chuyển tiếp của hàm myObjectOnTheStack không tham số và trả lại Object.

gì bạn muốn là

Object myObjectOnTheStack; 
Các vấn đề liên quan