Cấu tử ngầm định là gì

This entry is part 3 of 11 in the series Hướng đối tượng C++

87 / 100

Chào cả nhà
Trong bài viết này chúng ta sẽ đi tìm hiểu một hàm thành viên rất quan trọng của lớp đó chính là hàm khởi tạo và hàm huỷ.

Hàm khởi tạo [Constructor]

Hàm khởi tạo là gì?

Hàm khởi tạo là một hàm thành viên đặc biệt của một lớp. Nó sẽ được tự động gọi đến khi một đối tượng của lớp đó được khởi tạo.

Sự khác biệt giữa hàm tạo và hàm thành viên thông thường

Một hàm tạo sẽ khác những hàm thông thường ở những điểm sau:

  • Có tên trùng với tên lớp
  • Không có kiểu dữ liệu trả về [ kể cả kiểu void]
  • Tự động được gọi khi một đối tượng thuộc lớp được tạo ra
  • Nếu chúng ta không khai báo một hàm tạo, trình biên dịch C++ sẽ tự động tạo một hàm tạo mặc định cho chúng ta [sẽ là hàm ​​không có tham số nào và có phần thân trống].

Hàm tạo có thể rất hữu ích để thiết lập các giá trị khởi tạo cho các biến thành viên cụ thể.

Ví dụ đơn giản về hàm khởi tạo:

class sinhvien

{

private:

    string ten;

    int tuoi;

public:

    sinhvien[]; // Đây là hàm khởi tạo

    ~sinhvien[];

};

Các loại hàm khởi tạo

Hàm khởi tạo về cơ bản sẽ được chia làm 3 loại:

  1. Hàm khởi tạo không tham số [Cũng có thể gọi là hàm tạo mặc định – Default Constructor ]
  2. Hàm khởi tạo có tham số [ Parameterized Constructor ]
  3. Hàm khởi tạo sao chép [ Copy Constructor ]

Hàm khởi tạo không tham số [ Default Constructor ]

Hàm tạo loại này sẽ không truyền vào bất kì một đối số nào

class sinhvien

{

private:

    string ten;

    int tuoi;

public:

    sinhvien[]

    {

        this->ten = "";

        this->tuoi = 0;

    }

    ~sinhvien[];

};

Như trong ví dụ trên, hàm tạo sinhvien[] không hề có đối số nào được truyền vào.

Theo ý kiến riêng của mình thì thông thường trong hàm loại này mình sẽ gán cho tất cả các thuộc tính về giá trị mặc định.

Trong ví dụ trên:

  • Thuộc tính ten thuộc kiểu string mình sẽ đưa về mặc định là một chuối rỗng "".
  • Thuộc tính tuoi thuộc kiểu int mình sẽ đưa về mặc định là 0.

Hàm khởi tạo có tham số [ Parameterized Constructor ]

Với loại hàm tạo này ta có thể truyền đối số cho chúng. Thông thường, các đối số này giúp khởi tạo một đối tượng khi nó được tạo.

Để khai báo một hàm khởi tạo có tham số chỉ cần thêm các tham số vào nó giống như cách bạn thêm tham số bất kỳ hàm nào khác.Khi bạn xác định phần thân của hàm tạo, hãy sử dụng các tham số để khởi tạo đối tượng.

class sinhvien

{

private:

    string ten;

    int tuoi;

public:

    sinhvien[string param_ten, int param_tuoi]

    {

        this->ten = param_ten;

        this->tuoi = param_tuoi;

    }

    ~sinhvien[];

};

Sau khi khai báo hàm trong lớp, ta có thể dễ dàng dùng nó bằng cách truyền tham số trong khi khởi tạo đối tượng.

int main[]

{

    sinhvien obj["lap Trinh Khong Kho", 5]; // Ta truyền luôn tham số trong khi khới tạo đối tượng

}

Lưu ý:

  • Khi một đối tượng được khai báo trong hàm khởi tạo có tham số, các giá trị ban đầu phải được truyền dưới dạng đối số cho hàm tạo.
  • Cách khai báo đối tượng bình thường có thể sẽ gây lỗi.
    Điều này có nghĩa là bình thường để khai báo một đối tượng bạn sẽ khai báo bằng cú pháp:

Nhưng do hàm khởi tạo là hàm có tham số nên cú pháp sẽ phải là:

sinhvien obj["Lap Trinh Khong Kho", 5];

  • Các hàm khởi tạo có thể được gọi một cách rõ ràng hoặc ngầm định.

    sinhvien obj = sinhvien["Lap Trinh Khong Kho", 5]; // Đây là cách rõ ràng

    sinhvien obj["Lap Trinh Khong Kho", 5]; // Đây là cách ngầm định


    Nhưng thông thường để tiết kiệm code thì chúng ta hay sử dụng các ngầm định hơn.
Công dụng của hàm khởi tạo có tham số
  • Nó được sử dụng để khởi tạo các thành phần dữ liệu khác nhau của các đối tượng khác nhau với các giá trị khác nhau khi chúng được tạo.
  • Nó được sử dụng để nạp chồng các hàm khởi tạo.
    Nạp chồng? Có thể hiểu đơn giản là ta sẽ có nhiều hơn một hàm khởi tạo trong cùng một lớp. Và phần này thì sẽ được mình trình bài trong bài sau nhé.

Hàm khởi tạo sao chép [ Copy Constructor ]

Hàm khởi tạo sao chép là gì?

Hàm khởi tạo sao chép là một hàm tạo mà tạo một đối tượng bằng việc khởi tạo nó với một đối tượng của cùng lớp đó, mà đã được tạo trước đó.

Một hàm khởi tạo sao chép sẽ có nguyên mẫu chung như sau:

    ClassName[const ClassName &old_obj]

    {

        // Code

    }

Trong đó Classname là tên của lớp, old_obj là đối tượng cũ sẽ lấy làm gốc để sao chép sang đối tượng mới

Ví dụ đơn giản về hàm khởi tạo sao chép:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

/* Code by KingNNT */

#include

using namespace std;

class Point

{

private:

    int x, y;

public:

    Point[int x1, int y1]

    {

        x = x1;

        y = y1;

    }

    // Hàm khởi tạo sao chép

    Point[const Point &p2]

    {

        x = p2.x;

        y = p2.y;

    }

    int getX[] { return x; }

    int getY[] { return y; }

};

int main[]

{

    Point p1[10, 15]; // Hàm khởi tạo có tham số thông thường

    Point p2 = p1;    // hàm khởi tạo sao chép được gọi ở đây

    cout

Chủ Đề