Hàm tạo trong C++

Trong bài này, bạn sẽ được học về hàm tạo (constructor) trong C++. Bạn sẽ được học thế nào là một hàm tạo, cách viết và các kiểu hàm tạo trong C++.

Một hàm tạo là một kiểu đặc biệt của hàm thành viên giúp khởi tạo (initialise) đối tượng tự động khi nó được tạo.

Trình biên dịch xác định một hàm thành viên là hàm tạo thông qua tên và kiểu trả về của nó.

Hàm tạo có cùng tên với tên của lớp và nó không có bất kỳ kiểu trả về nào. Thêm vào đó, hàm tạo luôn luôn là public.

... .. ...
class temporary
{
private: 
	int x;
	float y;
public:
	// hàm tạo
	temporary(): x(5), y(5.5)
	{
		// thân của hàm tạo
	}
	... ..  ...
};

int main()
{
	Temporary t1;
	... .. ...
}

Chương trình trên thể hiện một hàm tạo được định nghĩa mà không có kiểu trả về và có cùng tên với lớp.

Hàm tạo hoạt động như thế nào?

Trong đoạn mã giả bên trên, temporary() là một hàm tạo.

Khi một đối tượng của lớp temporary được tạo ra, hàm tạo được gọi tự động và x sẽ được khởi tạo là 5 còn y được khởi tạo là 5.5.

Bạn cũng có thể khởi tạo dữ liệu thành viên bên trong thân hàm tạo như dưới đây. Tuy nhiên, cách này không được sử dụng nhiều.

temporary()
{
   x = 5;
   y = 5.5;
}
// Phương pháp này không được sử dụng nhiều

Cách sử dụng hàm tạo trong C++

Giả sử bạn đang làm việc với 100 đối tượng Person và giá trị mặc định của dữ liệu thành viên age là 0. Khởi tạo toàn bộ đối tượng bằng tay sẽ là một tác vụ rất khó khăn.

Thay vào đó, bạn có thể định nghĩa một hàm tạo giúp khởi tạo age bằng 0. Sau đó tất cả những gì bạn cần làm là tạo một đối tượng Person và hàm tạo sẽ tự động khởi tạo giá trị age.

Những trường hợp này rất hay xảy ra khi xử lý một mảng các đối tượng.

Thêm vào đó, nếu bạn muốn thực thi một đoạn mã ngay khi đối tượng được tạo ra, bạn có thể đặt đoạn mã đó bên trong thân của hàm tạo.

Ví dụ 1: Hàm tạo trong C++

Tính diện tích của hình chữ nhật và hiển thị nó.

#include <iostream>
using namespace std;

class Area
{
    private:
       int length;
       int breadth;

    public:
       // hàm tạo
       Area(): length(5), breadth(2){ }

       void GetLength()
       {
           cout << "Enter length and breadth respectively: ";
           cin >> length >> breadth;
       }

       int AreaCalculation() {  return (length * breadth);  }

       void DisplayArea(int temp)
       {
           cout << "Area: " << temp;
       }
};

int main()
{
    Area A1, A2;
    int temp;

    A1.GetLength();
    temp = A1.AreaCalculation();
    A1.DisplayArea(temp);

    cout << endl << "Default Area when value is not taken from user" << endl;

    temp = A2.AreaCalculation();
    A2.DisplayArea(temp);

    return 0;
}

Trong chương trình này, lớp Area được tạo cho việc tính diện tích. Nó có hai dữ liệu thành viên lengthbreadth.

Một hàm tạo được định nghĩa giúp khởi tạo length thành 5 và breadth thành 2.

Chúng ta cũng có 3 hàm thành viên khác đó là GetLength(), AreaCalculation()DisplayArea() để lấy chiều dài từ người dùng, tính diện tích và hiển thị ra màn hình.

Khi đối tượng A1A2 được tạo, lengthbreadth của hai đối tượng được khởi tạo lần lượt là 5 và 2, nhờ có hàm tạo.

Sau đó, hàm thành viên GetLength() được gọi để lấy giá trị lengthbreadth từ người dùng cho đối tượng A1. Điều này thay đổi chiều dài và chiều rộng của đối tượng A1.

Sau đó diện tích của đối tượng A1 được tính và lưu trong biến temp bằng cách gọi AreaCalculation() và cuối cùng, nó sẽ được in ra.

Đối với đối tượng A2, không có dữ liệu được nhập vào từ người dùng. Vì thế length và breadth vẫn là 5 và 2.

Sau đó, diện tích của A2 được tính và hiển thị, ở đây là 10.

Đầu ra

Enter length and breadth respectively: 6

7

Area: 42

Default Area when value is not taken from user

Area: 10

Nạp chồng hàm tạo

Hàm tạo có thể được nạp chồng giống như các hàm thông thường.

Hàm tạo được nạp chồng có cùng tên (tên của lớp) nhưng số lượng đối số khác nhau.

Tùy theo số lượng và kiểu của đối số truyền vào, một hàm tạo nhất định sẽ được gọi.

Vì có rất nhiều hàm tạo, đối số cho hàm tạo cũng nên được truyền khi tạo một đối tượng.

Ví dụ 2: Nạp chồng hàm tạo

// Mã nguồn để thể hiện cách hoạt động của nạp chồng hàm tạo
#include <iostream>
using namespace std;

class Area
{
    private:
       int length;
       int breadth;

    public:
       // hàm tạo không có đối số
       Area(): length(5), breadth(2) { }

       // Hàm tạo với hai đối số
       Area(int l, int b): length(l), breadth(b){ }

       void GetLength()
       {
           cout << "Enter length and breadth respectively: ";
           cin >> length >> breadth;
       }

       int AreaCalculation() {  return length * breadth;  }

       void DisplayArea(int temp)
       {
           cout << "Area: " << temp << endl;
       }
};

int main()
{
    Area A1, A2(2, 1);
    int temp;

    cout << "Default Area when no argument is passed." << endl;
    temp = A1.AreaCalculation();
    A1.DisplayArea(temp);

    cout << "Area when (2,1) is passed as argument." << endl;
    temp = A2.AreaCalculation();
    A2.DisplayArea(temp);

    return 0;
}

Đối với đối tượng A1, không có đối số nào được truyền khi tạo đối tượng.

Vì thế, hàm tạo không đối số sẽ được gọi trong khi khởi tạo length là 5 và breadth là 2. Vì vậy, diện tích của A1 sẽ là 10.

Đối với đối tượng A2, 2 và 1 được truyền vào như đối số khi tạo đối tượng.

Vì vậy, hàm tạo với hai đối số sẽ được gọi để khởi tạo length1 (2 trong trường hợp này) và breadthb (1 trong trường hợp này). Vì vậy, diện tích của đối tượng A2 sẽ là 2.

Đầu ra

Default Area when no argument is passed.

Area: 10

Area when (2,1) is passed as argument.

Area: 2

Hàm tạo sao chép mặc định (Default copy constructor)

Một đối tượng có thể được khởi tạo bằng một đối tượng khác có cùng kiểu. Đây giống như là việc sao chép nội dung của một lớp sang một lớp khác.

Trong chương trình trên, nếu bạn muốn khởi tạo một đối tượng A3 chứa cùng giá trị với A2, có thể làm như sau:

....
int main()
{
   Area A1, A2(2, 1);

   // Sao chép nội dung từ A2 sang A3
   Area A3(A2);
     OR, 
   Area A3 = A2;
}

Bạn có thể nghĩ, bạn cần tạo một hàm tạo mới để thực hiện công việc này. Nhưng thực tế thì không cần thêm hàm tạo nào khác. Đó là do hàm tạo sao chép mặc định được dựng sẵn cho toàn bộ các lớp.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *