Hàm thành viên của lớp khác hàm thông thường là gì?

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

83 / 100

Chào mọi người, trong bài trước thì mình đã hướng dẫn mọi người viết một class đơn giản. Trong phần tiếp theo, chúng ta cùng đi tìm hiểu hàm bạn là gì? Lớp bạn là gì nhé?

Đặt vấn đề cần truy cập dữ liệu

Giả sử ta có class sinhvien có thuộc tính masinhvien là private. Ta cũng có class giangvien có thuộc tính magiangvien là private.
Yêu cầu là chỉ dùng một hàm để in 2 giá trị thuộc tính này ra.

Đối với hàm get() này:

  • Không thể thuộc lớp sinhvien
  • Không thể thuộc lớp giangvien
  • Cũng không thể là một hàm tự do (vì hàm không thuộc class sẽ không truy cập thuộc tính private)

Nếu không nhớ các quyền truy cập private, protected, public các bạn có thể xem lại TẠI ĐÂY

Hàm bạn (friend function) trong C++

Hàm thành viên của lớp khác hàm thông thường là gì?

Định nghĩa

  • Hàm bạn trong c++ là hàm tự do, không thuộc lớp. Tuy nhiên hàm bạn trong c++ có quyền truy cập các thành viên private của lớp.
  • Một lớp trong c++ có thể có nhiều hàm bạn, và chúng phải nằm bên ngoài class.

Ưu điểm

  • Kiểm soát các truy nhập ở cấp độ lớp. Nghĩa là không thể áp đặt hàm bạn cho một lớp, nếu như chưa khai báo hàm bạn trong lớp.
  • Giải quyết được vấn đề cần truy cập dữ liệu của lớp như trên.

Cú pháp

Đặt từ khoá friend phía trước, sau đó khai báo như một hàm thông thường

Ví dụ:

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

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

#include <bits/stdc++.h>

using namespace std;

class giangvien;

class sinhvien

{

private:

    string masinhvien;

public:

    sinhvien()

    {

        this->masinhvien = "";

    }

    ~sinhvien()

    {

        this->masinhvien = "";

    }

    void set()

    {

        cout << "Nhap Ma Sinh Vien"; fflush(stdin); getline(cin, this->masinhvien);

    }

    friend void get(sinhvien a, giangvien b); // Khai báo hàm bạn trong class

};

class giangvien

{

private:

    string magiangvien;

public:

    giangvien()

    {

        this->magiangvien = "";

    }

    ~giangvien()

    {

        this->magiangvien = "";

    }

    void set()

    {

        cout << "Nhap Ma Giang Vien: "; fflush(stdin); getline(cin, this->magiangvien);

    }

    friend void get(sinhvien a, giangvien b); // Khai báo hàm bạn trong class

};

void get(sinhvien a, giangvien b)

{

    cout << "Ma Sinh Vien: " << a.masinhvien << endl;

    cout << "Ma Giang Vien: " << b.magiangvien << endl;

}

int main()

{

    sinhvien a;

    giangvien b;

    a.set(); b.set();

    get(a,b);

}

Ta truyền Input:

Sau khi chạy chương trình ta sẽ nhận được kết quả là:

Ma Sinh Vien: MSV001

Ma Giang Vien: MGV001

Lớp bạn (class function) trong C++

Hàm thành viên của lớp khác hàm thông thường là gì?

Tương tự như hàm bạn, lớp bạn ( friend class ) trong C++ cũng cho phép lớp bạn của lớp kia truy cập các thành viên private

Tính chất và mối quan hệ của lớp bạn

  • Khai báo lớp A là bạn của lớp B không có nghĩa lớp B là bạn của lớp A (chỉ có tính 1 chiều). Điều đó có nghĩa là chỉ có lớp A truy cập được thành viên của lớp B, nhưng ngược lại lớp B không thể truy cập ngược lại của lớp A.
  • Không đối xứng.
  • Không bắc cầu.

Cú pháp

Ta cũng dùng từ khoá friend để khai báo giống như khai báo hàm bạn.

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class A

{

private:

    int i;

public:

    friend class B; //Có lớp bạn là B

};

class B

{

public:

    void Change(A obj)

    {

        obj.i++;

    }

};

Như trong ví dụ trên, ta đã khai báo lớp B là bạn của lớp A, do đó lớp B có thể truy cập các thành viên trong lớp A ( Trong ví dụ là truy cập lớp A thông qua  Change(A obj) ).
Hãy thật lưu ý trong ví dụ trên B là bạn của A, B có thể truy cập vào A nhưng ngược lại thì không nhé.

Cảm ơn mọi người đã theo dõi và ủng hộ series của mình. Mình rất mong nhận được những ý kiến, đóng góp của các bạn để bài viết của mình ngày càng hoàng thiện hơn. Cảm ơn tất cả mọi người.