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:
| 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>    usingnamespacestd;    classHinhChuNhat {        private:            intchieuDai;        intchieuRong;    public:        HinhChuNhat(intchieuDai, intchieuRong) {            this->chieuDai = chieuDai;            this->chieuRong = chieuRong;        }        HinhChuNhat(): chieuDai(0) { }            friendintHienThiChieuDai(HinhChuNhat); //friend function    };    intHienThiChieuDai(HinhChuNhat hcn) {        hcn.chieuDai += 10;        returnhcn.chieuDai;    }    intmain() {        HinhChuNhat hcn = HinhChuNhat(10, 20);        cout << "Chieu dai cua hinh chu nhat la: "<< HienThiChieuDai(hcn)<<endl;        return0;    } | 
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:
| 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>  usingnamespacestd;  classLop2;          classLop1 {      inta;      public:          voidThietLapGiaTriA(inta)      {              this->a = a;          }        voidHienThi() {            cout << "Lop 1, a = "<< a << endl;        }        friendvoidTimGiaTriNhoNhat(Lop1, Lop2);       };  classLop2  {      intb;      public:          voidThietLapGiaTriB(intb)  {              this->b = b;          }        voidHienThi() {            cout << "Lop 2, b = "<< b << endl;        }        friendvoidTimGiaTriNhoNhat(Lop1, Lop2); };  voidTimGiaTriNhoNhat(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;  }  intmain()  {     Lop1 l1;     Lop2 l2;     l1.ThietLapGiaTriA(7);     l2.ThietLapGiaTriB(9);   l1.HienThi();   l2.HienThi();   TimGiaTriNhoNhat(l1, l2);     return0;   } | 
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:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream>  usingnamespacestd;  classLop1 {      inta = 10;      friendclassLop2;          };  classLop2 {    public:      voidHienThi(Lop1 &l1) {          cout << "Gia tri cua a la: "<< l1.a;      }  };  intmain() {      Lop1 l1;      Lop2 l2;      l2.HienThi(l1);      return0;  } | 
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
 
                                       


 
							 
							 
							 
							 
							 
							 
							 
							 
							 
							 
							 
							 
							 
															
							 
															
							 
                             
             
            
 Vietnamese
 Vietnamese Afrikaans
 Afrikaans Albanian
 Albanian Amharic
 Amharic Arabic
 Arabic Armenian
 Armenian Azerbaijani
 Azerbaijani Basque
 Basque Belarusian
 Belarusian Bengali
 Bengali Bosnian
 Bosnian Bulgarian
 Bulgarian Catalan
 Catalan Cebuano
 Cebuano Chichewa
 Chichewa Chinese (Simplified)
 Chinese (Simplified) Chinese (Traditional)
 Chinese (Traditional) Corsican
 Corsican Croatian
 Croatian Czech
 Czech Danish
 Danish Dutch
 Dutch English
 English Esperanto
 Esperanto Estonian
 Estonian Filipino
 Filipino Finnish
 Finnish French
 French Frisian
 Frisian Galician
 Galician Haitian Creole
 Haitian Creole Georgian
 Georgian German
 German Greek
 Greek Gujarati
 Gujarati Hausa
 Hausa Hawaiian
 Hawaiian Hebrew
 Hebrew Hindi
 Hindi Hmong
 Hmong Hungarian
 Hungarian Icelandic
 Icelandic Igbo
 Igbo Indonesian
 Indonesian Irish
 Irish Italian
 Italian Japanese
 Japanese Javanese
 Javanese Kannada
 Kannada Kazakh
 Kazakh Khmer
 Khmer Korean
 Korean Kurdish (Kurmanji)
 Kurdish (Kurmanji) Kyrgyz
 Kyrgyz Lao
 Lao Latin
 Latin Latvian
 Latvian Lithuanian
 Lithuanian Luxembourgish
 Luxembourgish Macedonian
 Macedonian Malagasy
 Malagasy Malay
 Malay Malayalam
 Malayalam Maltese
 Maltese Maori
 Maori Marathi
 Marathi Mongolian
 Mongolian Myanmar (Burmese)
 Myanmar (Burmese) Nepali
 Nepali Norwegian
 Norwegian Pashto
 Pashto Persian
 Persian Polish
 Polish Portuguese
 Portuguese Punjabi
 Punjabi Romanian
 Romanian Russian
 Russian Samoan
 Samoan Scottish Gaelic
 Scottish Gaelic Sinhala
 Sinhala Serbian
 Serbian Sesotho
 Sesotho Shona
 Shona Sindhi
 Sindhi Slovenian
 Slovenian Slovak
 Slovak Somali
 Somali Spanish
 Spanish Sundanese
 Sundanese Swahili
 Swahili Swedish
 Swedish Tajik
 Tajik Tamil
 Tamil Telugu
 Telugu Thai
 Thai Turkish
 Turkish Ukrainian
 Ukrainian Urdu
 Urdu Uzbek
 Uzbek Welsh
 Welsh Xhosa
 Xhosa Yiddish
 Yiddish Yoruba
 Yoruba Zulu
 Zulu