1. Hàm bạn trong C++

Nếu một hàm được định nghĩa là một hàm bạn (Friend function) trong C++, thì dữ liệu được bảo vệ (protected) và riêng tư (private) của một lớp có thể được truy cập bằng cách sử dụng hàm.

Nếu các bạn nào chưa biết các khái niệm private, protected, public thì có thể xem lại bài access modifier trong C++ ở bài trước nhé.

Cú pháp

Cú pháp để khai báo hàm bạn (Friend function) trong C++ như sau:

class TenLop    
{    
    friend KieuDuLieu TenHam([Tham so]);
};

Ví dụ

Chúng ta cùng xem xét một ví dụ đơn giản về hàm bạn (Friend function) trong C++ như sau:

Ví dụ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>   
using namespace std;   
class HinhChuNhat {   
    private:   
        int chieuDai;
        int chieuRong;
    public:
        HinhChuNhat(int chieuDai, int chieuRong) {
            this->chieuDai = chieuDai;
            this->chieuRong = chieuRong;
        }
        HinhChuNhat(): chieuDai(0) { }   
        friend int HienThiChieuDai(HinhChuNhat); //friend function   
};   
int HienThiChieuDai(HinhChuNhat hcn) {   
    hcn.chieuDai += 10;   
    return hcn.chieuDai;   
}   
int main() {   
    HinhChuNhat hcn = HinhChuNhat(10, 20);   
    cout << "Chieu dai cua hinh chu nhat la: " << HienThiChieuDai(hcn)<<endl;   
    return 0;   
}

Và kết quả sau khi thực thi chương trình trên như sau:

Ở ví dụ trên mình có sử dụng con trỏ this và hàm xây dựng trong C++, nếu bạn nào chưa biết thì có thể xem lại ở các bài trước nhé.

Chúng ta cùng xem tiếp một ví dụ nữa về hàm bạn giữa 2 lớp trong C++ như sau:

Ví dụ
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
#include <iostream> 
using namespace std; 
class Lop2;         
class Lop1 { 
    int a; 
    public
        void ThietLapGiaTriA(int a)      { 
            this->a = a; 
        }
        void HienThi() {
            cout << "Lop 1, a = " << a << endl;
        }
        friend void TimGiaTriNhoNhat(Lop1, Lop2);      
}; 
class Lop2  { 
    int b; 
    public
        void ThietLapGiaTriB(int b)  { 
            this->b = b; 
        }
        void HienThi() {
            cout << "Lop 2, b = " << b << endl;
        }
        friend void TimGiaTriNhoNhat(Lop1, Lop2);
}; 
void TimGiaTriNhoNhat(Lop1 l1, Lop2 l2)  {
    cout << "Gia tri nho nhat trong 2 lop la: ";
    if(l1.a <= l2.b) 
        cout << l1.a << endl; 
    else
        cout << l2.b << endl; 
int main()  { 
   Lop1 l1; 
   Lop2 l2; 
   l1.ThietLapGiaTriA(7); 
   l2.ThietLapGiaTriB(9);
   l1.HienThi();
   l2.HienThi();
   TimGiaTriNhoNhat(l1, l2); 
   return 0; 
 }

Và kết quả sau khi thực thi chương trình trên như sau:

Ở ví dụ trên hàm TimGiaTriNhoNhat là hàm bạn của cả hai lớp Lop1 và Lop2 vì vậy hàm TimGiaTriNhoNhat có thể truy cập dữ liệu thành viên private của cả hai lớp.

Trong C++ có hổ trợ thêm khái niệm khác nữa đó là lớp bạn (Friend class). Vậy lớp bạn là gì? Chúng ta sẽ cùng tìm hiểu ở phần sau đây.

2. Lớp bạn (Friend class)

Một lớp bạn (friend class) có thể truy cập cả các thành viên riêng tư và được bảo vệ của lớp mà nó đã được khai báo là friend.

Ví dụ

Chúng ta cùng xem một ví dụ đơn giản về lớp bạn (friend class) trong C++ như sau:

Ví dụ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
using namespace std; 
class Lop1 { 
    int a = 10; 
    friend class Lop2;         
}; 
class Lop2 { 
  public
    void HienThi(Lop1 &l1) { 
        cout << "Gia tri cua a la: "<< l1.a; 
    
}; 
int main() { 
    Lop1 l1; 
    Lop2 l2; 
    l2.HienThi(l1); 
    return 0; 
}

Và kết quả sau khi thực thi chương trình trên như sau:

Trong ví dụ trên, Lop2 được khai báo là friend trong lớp Lop1. Do đó, Lop2 là bạn của Lop1. Lop2 có thể truy cập các thành viên private của Lop1.

3. Kết luận

Như vậy là chúng ta đã tìm hiểu xong về hàm bạn (friend function) và lớp bạn (friend class) trong C++ là gì rồi.

Nếu các bạn muốn truy xuất thành viên của lớp ở dạng private hoặc protected từ một hàm hoặc lớp khác thì chúng ta sử dụng hàm bạn hoặc lớp bạn.

Nguồn: https://freetuts.net

 

 

Được quan tâm nhiều nhất

  • Apple Watch Series 5 Teardown - Always on Display Explained

  • Apple Watch Series 4 Teardown

  • iPhone 11 Pro Max Teardown - Tiny Motherboard & BIG Battery!

Bạn thấy bài viết này thế nào?
Thể hiện yêu thương tác giả ở đây nhé!

Thích bài viết

thích

Chia sẻ ngay!

phuongle

Thành viên từ: 10/12/2019

Điểm uy tín: 7,503

SMod: 1,288 hướng dẫn đã chia sẻ

Team

Lập Trình Thành viên của Lập Trình

1 Thành viên

1,288 bài viết

Thêm bình luận

Bình luận bằng tài khoản Facebook

Tìm người tài chia sẽ giúp đỡ cộng đồng!

Tham gia ngay Đóng
Amharic Amharic Arabic Arabic Bengali Bengali Chinese (Simplified) Chinese (Simplified) Chinese (Traditional) Chinese (Traditional) English English Filipino Filipino French French German German Hausa Hausa Hindi Hindi Indonesian Indonesian Italian Italian Japanese Japanese Korean Korean Persian Persian Portuguese Portuguese Russian Russian Serbian Serbian Spanish Spanish Thai Thai Turkish Turkish Urdu Urdu Vietnamese Vietnamese