23/08/2018, 11:01

Hàm friend trong C++

Hàm friend trong C++ của một lớp được định nghĩa bên ngoài phạm vi lớp đó, nhưng nó có quyền truy cập tất cả thành viên private và protected của lớp đó. Ngay cả khi các nguyên mẫu cho hàm friend xuất hiện trong định nghĩa lớp, thì các hàm friend không là các hàm ...

Hàm friend trong C++ của một lớp được định nghĩa bên ngoài phạm vi lớp đó, nhưng nó có quyền truy cập tất cả thành viên private và protected của lớp đó. Ngay cả khi các nguyên mẫu cho hàm friend xuất hiện trong định nghĩa lớp, thì các hàm friend không là các hàm thành viên.

Một friend có thể là một hàm, một mẫu hàm, hoặc hàm thành viên, hoặc một lớp hoặc một mẫu lớp, trong trường hợp này, toàn bộ lớp và tất cả thành viên của nó là friend.

Để khai báo một hàm dạng hàm friend của một lớp, đặt trước nguyên mẫu hàm đó trong định nghĩa lớp với từ khóa friend trong C++, như sau:

class Box
{
   double chieurong;
public:
   double chieudai;
   friend void inChieuRong( Box box );
   void setChieuRong( double rong );
};

Để khai báo tất cả hàm thành viên của lớp LopHai là dạng friend của lớp LopMot, đặt một khai báo sau trong định nghĩa của lớp LopMot:

friend class LopHai;

Bạn xét chương trình sau:

#include <iostream>
 
using namespace std;
 
class Box
{
   double chieurong;
public:
   friend void inChieuRong( Box box );
   void setChieuRong( double rong );
};

// phan dinh nghia ham thanh vien
void Box::setChieuRong( double rong )
{
    chieurong = rong;
}

// Ghi chu: inChieuRong() khong la ham thanh vien cua bat cu class nao.
void inChieuRong( Box box )
{
   /* Boi vi, ham inChieuRong() la ham friend cua Box, do vay no co the
    truc tiep truy cap bat cu thanh vien nao cua class nay */
    
   cout << "Chieu rong cua box la: " << box.chieurong <<endl;
}
 
// ham main cua chuong trinh
int main( )
{
   Box box;
 
   // thiet lap chieurong cua box, khong su dung ham thanh vien
   box.setChieuRong(25.3);
   
   // su dung ham friend de in chieu rong.
   inChieuRong( box );
 
   return 0;
}

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Theo Tutorialspoint

Bài trước: Copy constructor trong C++

Bài tiếp: Hàm inline trong C++

0