Bài viết này hướng về phân tích sự khác biệt giữa khái niệm:
- Hàm tạo mặc định - Default Constructor.
- Hàm tạo không đối số - Constructor with no parameters - trong lập trình hướng đối tượng.
Hàm tạo mặc định
Hàm tạo mặc định không phải là 1 hàm tạo, nó là 1 khái niệm nhằm nói về loại hàm tạo không cần truyền đối số, mặc định sử dụng khi khai báo 1 đối tượng của lớp.
Cần tránh hiểu nhầm hàm tạo mặc định là hàm tạo không đối số. Đôi khi 1 hàm tạo có đối số mặc định cũng được sử dụng như hàm tạo mặc định (tất cả đối số của hàm tạo đều có giá trị mặc định).
Hàm tạo mặc định của lớp cơ sở còn được sử dụng khi sử dụng hàm tạo của lớp kế thừa mà không khai báo sẽ sử dụng hàm tạo nào của lớp cơ sở.
Ví dụ về 2 trường hợp sử dụng hàm tạo mặc định:
MyClass l_object; MyClass* l_pointer = new MyClass();
Ví dụ về trường hợp sử dụng và không sử dụng hàm tạo mặc định của lớp cơ sở:
// Use the BaseClass's Default Constructor DeliveredClass() : BaseClass() { } // Use the BaseClass's Default Constructor DeliveredClass(float a, float b, int c) { } DeliveredClass(int a, int b) : BaseClass(a) { }
Hàm tạo không đối
Hàm tạo không đối là loại hàm tạo không cần truyền vào đối số. Hàm tạo không đối được trình biên dịch tự động sinh ra khi viết 1 lớp không có hàm tạo, tuy nhiên, nếu lớp đã có khai báo bất kỳ 1 loại hàm tạo nào khác, trình biên dịch sẽ không sinh ra hàm tạo không đối cho lớp.
Ví dụ về hàm tạo không đối:
class MyClass { public: MyClass() { // Do something } // Some other methods and properties }
Hàm tạo có đối số mặc định
Hàm tạo có đối số mặc định là hàm tạo có đối số với 1, 1 số hoặc tất cả đối số đều có giá trị mặc định.
Hàm tạo có đối số mặc định không yêu cầu lập trình viên truyền vào tất cả các đối số để chạy. Chỉ cần truyền vào tối thiểu là tất cả các đối số không có giá trị mặc định.
Trường hợp có nhiều hàm tạo có đối số mặc định trong 1 lớp thì danh sách đối số không có giá trị mặc định của mỗi hàm nên khác nhau, vì có thể dẫn tới lỗi biên dịch khi sử dụng.
Các đối số có giá trị mặc định phải được đặt ở cuối danh sách đối số.
Hàm tạo có đối số mặc định sẽ trở thành Hàm tạo mặc định nếu tất cả các đối số của hàm đều có giá trị mặc định.
Ví dụ về khai báo hàm tạo có đối số mặc định:
MyClass(float f, double* b = nullptr, double d = 5.0, int c = 3); MyClass(int a = 5, double* b = nullptr); // Default Constructor
Ví dụ về sử dụng hàm tạo có đối số mặc định:
MyClass l_object1(5, nullptr, 6.1); // First constructor MyClass l_object2; // Second constructor MyClass* l_pointer = new MyClass(); // Second constructor