2010-09-28 40 views
19

Mã này không hoạt động như cách tôi mong đợi.Tại sao không có cuộc gọi đến nhà xây dựng?

#include<iostream> 
using namespace std; 

class Class 
{ 
    Class() 
    { 
     cout<<"default constructor called"; 
    } 

    ~Class() 
    { 
     cout<<"destrutor called"; 
    } 
}; 

int main() 
{  
    Class object(); 
} 

Tôi mong đợi hàm tạo mặc định của đầu ra được gọi là ', nhưng tôi không thấy bất kỳ thứ gì là đầu ra. Vấn đề là gì?

+3

constructor của bạn là tư nhân. –

+2

@dribeas: Đây không phải là phân tích cú pháp gây tranh cãi nhất; nó chỉ là một phân tích hơi vexing. "Phân tích cú pháp khó chịu nhất" thường được dành riêng cho một nỗ lực để tạo ra một biến với một khởi tạo trực tiếp của một giá trị khởi tạo tạm thời: 'A a (A());' (sai lầm của tôi ban đầu.) –

+0

xem thêm http://stackoverflow.com/questions/180172/default-constructor-with-empty-brackets –

Trả lời

17

Không gọi đến constructor

Bởi vì các nhà xây dựng không bao giờ được gọi thực sự.

Class object(); được hiểu như là việc kê khai của một hàm object dùng không đối số và trả về một đối tượng của Class [Giá]

Hãy thử Class object;

EDIT:

Như Mike nhận thấy đây là không chính xác mã giống như những gì bạn đang cung cấp cho trình biên dịch. Là hàm tạo/destructor public hoặc là Class một cấu trúc?

Tuy nhiên, Google cho C++ phân tích cú pháp gây tranh cãi nhất.

+0

Nhận câu trả lời một lúc trước khi tôi _and_ định dạng lại bài đăng. +1 – JoshD

+0

Cảm ơn @JoshD :) –

31

Không. Dòng của bạn Class object(); Đã khai báo một hàm. Những gì bạn muốn viết là Class object;

Hãy dùng thử.

Bạn cũng có thể quan tâm đến phân tích cú pháp gây tranh cãi nhất (như những người khác đã lưu ý). Một ví dụ tuyệt vời là trong Effective STL Mục 6 ở trang 33. (Trong lần in thứ 12, tháng 9 năm 2009.) Cụ thể, ví dụ ở đầu trang 35 là những gì bạn đã làm và giải thích tại sao trình phân tích cú pháp xử lý nó dưới dạng khai báo hàm.

+1

+1, btw Các vấn đề của Visual C++ cảnh báo C4930: chức năng prototyped không được gọi (là định nghĩa biến được dự định?) 'Trong các trường hợp như vậy. – sharptooth

+1

Tuy nhiên, đó có phải là "phân tích cú pháp khó chịu nhất"? Tôi luôn luôn nghĩ rằng cụm từ được gọi là vấn đề khó chịu hơn, rằng 'T x (T())' là một khai báo hàm. –

+0

@ James McNellis: Đó là những gì Scott Meyers gọi nó. Tôi không hoàn toàn đồng ý, và tôi thậm chí không kết nối câu hỏi này với nó ngay lập tức. Tôi nghĩ rằng ví dụ của bạn là phổ biến hơn và bực bội. – JoshD

0

Bạn có thể sử dụng nó như thế này:

Class obj; 
//or 
Class *obj = new Class(/*constructor arguments*/); 
Các vấn đề liên quan