2010-10-24 77 views
7

Giả sử tôi có một lớpconstructor với một tham số mặc định

class C { 
     C(int a=10); 
}; 

lý do tại sao nếu tôi gọi

C c; 

các contructor C(int =10) được gọi và nếu tôi gọi

C c(); 

constructor mặc định được gọi là? Làm thế nào để tránh điều này? Tôi muốn thực hiện chỉ constructor của tôi, tôi đã cố gắng để làm cho constructor mặc định riêng tư, nhưng nó không hoạt động.

+3

Làm thế nào để bạn cung cấp cho chúng tôi một đoạn mã có thể biên dịch cho chúng ta thấy hành vi mà bạn tin rằng bạn đang thấy? Như bạn có thể thấy từ các câu trả lời cho đến nay, những gì bạn mô tả không phải là những gì mã nên làm. – sbi

+0

Cũng giống như một FYI, MSVC (kể từ ít nhất VS2003) sẽ cung cấp cảnh báo về vấn đề này: 'cảnh báo C4930: 'C c (void)': chức năng prototyped không được gọi (là định nghĩa biến?)' Tôi biết các trình biên dịch khác sẽ là tốt, nhưng những người tôi đã có sẵn tại thời điểm này không. –

Trả lời

17
  1. Trên thực tế, C c(); nên được phân tích như một khai báo hàm . Để gọi rõ ràng constructor mặc định, bạn cần phải viết C c = C();.
  2. Khi bạn xác định bất kỳ hàm tạo nào, trình biên dịch sẽ không cung cấp hàm tạo mặc định cho loại của bạn, vì vậy không thể gọi được.
  3. Vì hàm tạo của bạn có thể được gọi với một đối số, nó đóng vai trò như một hàm chuyển đổi ngầm định. Bạn nên cân nhắc tạo nó explicit, để ngăn các chuyển đổi tiềm ẩn khởi động vào những khoảnh khắc bất ngờ.
+0

@Greg: Cảm ơn, tôi không chắc chắn cách tôi quản lý để làm điều đó! ':)' – sbi

14

C c(); không làm những gì bạn nghĩ nó:

Nó tuyên bố một chức năng gọi là c rằng không có đối số và trả về một C. Số này tương đương với

C c(void); 
+0

Điều quan trọng là nó không làm gì (về hành vi thời gian chạy). –

1

Điều này là do hàm c() được hiểu là hàm có tên c. C() sẽ kích hoạt hàm tạo thích hợp cho lớp C

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