Biên tập. Trên thực tế, trong khi những gì tôi nói trong câu trả lời đầu tiên của tôi là hợp lệ, thì đây là lý do thực sự:
Lúc đầu, C. C không hướng đối tượng (bạn có thể thực hiện phương pháp OO, nhưng nó không giúp bạn hoặc thực thi bất cứ điều gì).
Sau đó, có C With Classes, sau đó được đổi tên thành C ++. C ++ là hướng đối tượng và do đó khuyến khích đóng gói và đảm bảo bất biến của đối tượng - khi xây dựng và ở đầu và cuối của bất kỳ phương thức nào, đối tượng ở trạng thái hợp lệ.
Điều tự nhiên phải làm với điều này là bắt buộc một lớp phải luôn có một hàm tạo để đảm bảo nó bắt đầu ở trạng thái hợp lệ - nếu hàm tạo không phải làm gì để đảm bảo điều này, thì hàm tạo rỗng sẽ ghi lại sự thật này .
Nhưng một mục tiêu với C ++ là tương thích với C đến mức có thể, tất cả các chương trình C hợp lệ cũng là các chương trình C ++ hợp lệ (không còn là mục tiêu hoạt động và sự phát triển của C tách biệt với C ++ có nghĩa là nó không còn giữ ).
Một ảnh hưởng của điều này là sự trùng lặp về chức năng giữa struct
và class
. Cái trước làm mọi thứ theo cách C (mọi thứ theo mặc định) và cái sau làm mọi thứ theo cách OO tốt (mọi thứ theo mặc định, nhà phát triển chủ động công khai những gì họ muốn công khai).
Một điều nữa là để một C struct
, không thể có hàm tạo vì C không có hàm tạo, có giá trị trong C ++, thì phải có ý nghĩa đối với cách nhìn của C ++. Và vì vậy, trong khi không có hàm tạo sẽ đi ngược lại thực tiễn OO là chủ động đảm bảo bất biến, C ++ đã hiểu điều này có nghĩa là có một hàm tạo không tham số mặc định hoạt động giống như nó có phần thân trống.
Tất cả C structs
bây giờ là C ++ hợp lệ structs
, (có nghĩa là chúng giống với C ++ classes
với mọi thứ - thành viên và thừa kế - công khai) được xử lý từ bên ngoài như thể nó có một hàm tạo không tham số.
Tuy nhiên, nếu bạn đã đặt một hàm tạo vào một class
hoặc struct
, thì bạn đang thực hiện mọi thứ theo cách C ++ / OO thay vì cách C và không cần một hàm tạo mặc định.
Vì nó được dùng như một cách viết tắt, mọi người vẫn tiếp tục sử dụng nó ngay cả khi khả năng tương thích là không thể (nó sử dụng các tính năng C ++ khác không có trong C).
Do đó, khi Java xuất hiện (dựa trên C ++ theo nhiều cách) và sau đó là C # (dựa trên C ++ và Java theo các cách khác nhau), họ đã giữ cách tiếp cận này như một thứ mà các lập trình viên có thể đã sử dụng.
Stroustrup viết về điều này trong Ngôn ngữ lập trình C ++ của mình và thậm chí còn hơn thế, tập trung nhiều hơn vào "các hệ thống" của ngôn ngữ trong Thiết kế và tiến hóa của C ++ .
=== Câu trả lời gốc ===
Hãy nói điều này đã không xảy ra.
Giả sử tôi không muốn một nhà xây dựng không tham số, bởi vì tôi không thể đưa lớp của mình vào trạng thái có ý nghĩa mà không có ai. Thật vậy, đây là điều có thể xảy ra với struct
C # (nhưng nếu bạn không thể sử dụng một cách có ý nghĩa các số không và không struct
trong C # thì tốt nhất bạn nên sử dụng tối ưu hóa không hiển thị công khai và nếu không thì có lỗ hổng thiết kế trong việc sử dụng struct
).
Để làm cho lớp của tôi có thể bảo vệ sự bất biến của nó, tôi cần một removeDefaultConstructor
từ khóa đặc biệt . Ít nhất, tôi cần tạo một hàm tạo không tham số riêng để đảm bảo không có mã gọi nào gọi mặc định.
Mà làm phức tạp thêm một số ngôn ngữ. Tốt hơn không nên làm điều đó.
Nói chung, tốt nhất không nên nghĩ đến việc thêm một hàm tạo như loại bỏ mặc định, tốt hơn hết là nghĩ rằng không có hàm tạo nào là đường cú pháp để thêm một hàm tạo không tham số mà không làm gì cả.