2012-10-02 41 views
7

thể trùng lặp:
Why is there no call to the constructor?Sự khác nhau giữa Test t; và Kiểm tra t() ;? nếu thử nghiệm là một lớp

Tôi đang sử dụng Visual studio 2012, Giả thử nghiệm là một lớp

class Test 
{ 
}; 

Khi tôi tạo một đối tượng mới Kiểm tra, sự khác biệt của hai cách sau đây là gì?

cách 1

Test t; 

cách 2

Test t(); 

Tôi có câu hỏi này trong các mã dưới đây, ban đầu, tôi đã xác định một thể hiện của A theo cách 2, tôi đã chỉ có một lỗi vì B không cung cấp một hàm tạo mặc định, nhưng khi tôi định nghĩa nó theo cách 1, tôi nhận được một lỗi bổ sung.

class B 
{ 
    B(int i){} 
}; 

class A 
{ 
    A(){} 
    B b; 
}; 

int main(void) 
{ 
    A a(); // define object a in way 2 

    getchar() ; 
    return 0 ; 
} 

nếu tôi xác định một trong cách 1

A a; 

tôi sẽ nhận lỗi khác nói

lỗi C2248: 'A :: A': không thể truy cập thành viên tin khai báo trong lớp 'A'

Vì vậy, tôi đoán phải có một số khác biệt tween hai cách.

Trả lời

50

enter image description here

Test t; định nghĩa một biến gọi là t loại Test.

Test t(); tuyên bố hàm có tên t không có tham số và trả lại Test.

+20

+1 cho hình ảnh :-) –

+1

tốt, một câu hỏi ngu ngốc, tôi chắc chắn tôi biết rằng trước đây, nhưng ... nó không phải là ngày của tôi hôm nay,: ( – zdd

+0

@zdd nó xảy ra. –

17

Sự khác biệt giữa hai lần khai báo là gì?

A a(); 

Khai báo một chức năng và không phải là một đối tượng. Đây là một trong số Most vexing parse bằng C++.
Nó tuyên bố một hàm theo tên a không có tham số và trả về loại A.

A a; 

Tạo một đối tượng tên là a loại A bằng cách gọi constructor mặc định của nó.

Tại sao bạn gặp lỗi biên dịch?

Đối với một specifier truy cập lớp mặc định là private do đó, bạn nhận được lỗi vì constructor lớp học của bạn là private và nó không thể được gọi trong khi tạo ra các đối tượng với cú pháp trên.

+0

cảm ơn bạn rất nhiều. – zdd

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