2011-07-21 34 views
15

Trong mã bên dưới, tại sao trình biên dịch không khiếu nại đối với mClass2?C++ - Điều này sẽ làm gì nếu hàm tạo là riêng tư?

class CMyClass{ 
private: 
    CMyClass(){} 
}; 

void TestMethod(){ 
    CMyClass mClass1; //Fails. 
    CMyClass mClass2(); //Works. 
} 
+0

liên quan http://stackoverflow.com/questions/4296090/some-problems-while-learning-stl/4296118#4296118 –

+1

Còn được gọi là: Hầu hết gây nhiều tranh cãi Parse (xem http: // en. wikipedia.org/wiki/Most_vexing_parse) –

Trả lời

16

Vì bạn vừa khai báo hàm mClass2 không đối số trả về CMyClass. Đó là một tùy chọn hợp lệ vì có thể, ví dụ, một thể hiện static CMyClass mà chức năng đó có quyền truy cập. Lưu ý rằng CMyClass vẫn có một hàm tạo bản sao công khai.

(Để thuyết phục chính mình, biên dịch module này để lắp ráp và nhận xét rằng ý kiến ​​ra dòng CMyClass mClass2(); sẽ cho kết quả tương tự.)

+1

Ngoài ra, một hàm tạo di chuyển hợp lệ. – Arafangion

+0

Cảm ơn rất nhiều. :) – R4D4

10

Bởi vì nó được định nghĩa một hàm và không gọi constructor như bạn nghĩ.

Điều này được gọi là Most Vexing Parse bằng C++.

CMyClass mClass2(); 

tuyên bố một hàm mClass2() mà mất không tham số và trả về CMyClass

+0

** Phân tích cú pháp vexing nhất ** - không thể nói tôi từng nghe về điều đó trước đây, tôi sẽ xem xét điều đó, cảm ơn bạn. :) – R4D4

+0

@ R4D4: Đã thêm liên kết để bạn tìm kiếm :) –

1

Điều thứ hai là một khai báo hàm.

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