2011-07-21 66 views
5

Tôi có một câu hỏi: constructor nào được sử dụng khi bạn tạo một thể hiện của một lớp với ClassName instance() trong C++?Tạo một thể hiện của một lớp với()

Ví dụ:

#include <iostream> 

using namespace std; 

class Test 
{ 
private: 
    Test() 
    { 
     cout << "AAA" << endl; 
    } 

public: 
    Test(string str) 
    { 
     cout << "String = " << str << endl; 
    } 
}; 

int main() 
{ 
    Test instance_1(); // instance_1 is created... using which constructor ? 
    Test instance_2("hello !"); // Ok 

    return 0; 
} 

Cảm ơn!

Trả lời

11

Khéo léo! Bạn mong đợi việc biên dịch thất bại vì hàm tạo mặc định là riêng tư. Tuy nhiên, nó biên dịch và không có gì được tạo ra. Nguyên nhân?

Test instance_1(); 

... chỉ là khai báo hàm! (Mà trả Test và mất gì cả.)

+3

Đó là những gì tôi định nói, nhưng bạn đã đánh tôi với nó. Đây là C++ phân tích cú pháp vexing nhất (http://en.wikipedia.org/wiki/Most_vexing_parse). –

+0

phân tích cú pháp vexing là một tên rất thích hợp! và các câu hỏi trong thẻ này http://stackoverflow.com/questions/tagged/most-vexing-parse là một bằng chứng tuyệt vời. – tomasz

6

Tuyên bố Test instance_1(); không gọi một constructor ở tất cả, bởi vì nó không xác định một biến - thay vào đó, nó được định nghĩa một hàm gọi là instance_1 trả về một đối tượng kiểu Test. Để tạo một cá thể bằng cách sử dụng hàm tạo 0-đối số, bạn sẽ sử dụng Test instance_1;.

+0

Hoặc cú pháp C++ 0x mới -> Test instance_1 {}; – David

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