Chi tiết bài học Hàm tạo trong C++

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à những 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 lập một hàm thành viên là hàm tạo trải 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 biểu lộ 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 người tiêu dùng của lớp temporary được tạo ra, hàm tạo được gọi tự động hóa 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 hoàn toàn có thể khởi tạo tài 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 thao tác với 100 đối tượng người dùng Person và giá trị mặc định của tài liệu thành viên age là 0. Khởi tạo hàng loạt đối tượng người tiêu dùng bằng tay sẽ là một tác vụ rất khó khăn vất vả .
Thay vào đó, bạn hoàn toàn có thể định nghĩa một hàm tạo giúp khởi tạo age bằng 0. Sau đó tổng thể những gì bạn cần làm là tạo một đối tượng người tiêu dùng Person và hàm tạo sẽ tự động hóa khởi tạo giá trị age .
Những trường hợp này rất hay xảy ra khi giải quyết và xử lý một mảng những đối tượng người tiêu dùng .
Thêm vào đó, nếu bạn muốn thực thi một đoạn mã ngay khi đối tượng người dùng được tạo ra, bạn hoàn toà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 
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 quy hoạnh. Nó có hai tài liệu thành viên length và breadth .
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 ( ) và DisplayArea ( ) để lấy chiều dài từ người dùng, tính diện tích quy hoạnh và hiển thị ra màn hình hiển thị .
Khi đối tượng người dùng A1 và A2 được tạo, length và breadth của hai đối tượng người tiêu dù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ị length và breadth từ người dùng cho đối tượng người tiêu dùng A1. Điều này đổi khác chiều dài và chiều rộng của đối tượng người dùng A1 .
Sau đó diện tích quy hoạnh của đối tượng người tiêu dùng A1 được tính và lưu trong biến temp bằng cách gọi AreaCalculation ( ) và sau cuối, nó sẽ được in ra .
Đối với đối tượng người tiêu dùng A2, không có tài 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 quy hoạnh 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 hoàn toàn có thể được nạp chồng giống như những hàm thường thì .
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 người dù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 
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 người dùng A1, không có đối số nào được truyền khi tạo đối tượng người tiêu dù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 quy hoạnh của A1 sẽ là 10 .
Đối với đối tượng người dùng A2, 2 và 1 được truyền vào như đối số khi tạo đối tượng người tiêu dùng .
Vì vậy, hàm tạo với hai đối số sẽ được gọi để khởi tạo length là 1 ( 2 trong trường hợp này ) và breadth là b ( 1 trong trường hợp này ). Vì vậy, diện tích quy hoạnh của đối tượng người dù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 người dùng hoàn toàn có thể được khởi tạo bằng một đối tượng người dù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 người dùng A3 chứa cùng giá trị với A2, hoàn toàn 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 hoàn toàn có thể nghĩ, bạn cần tạo một hàm tạo mới để triển khai việc làm này. Nhưng thực tiễn 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 hàng loạt những lớp .