Friend trong C++ | Laptrinhcanban.com

Friend trong C++

Cùm tìm hiểu về Friend trong C++. Bạn sẽ biết khái niệm friend trong C++ là gì, Lớp bạn (Friend class) và Hàm bạn (Friend function) trong C++ là gì cũng như cách sử dụng chúng sau bài học này.

Friend trong C++ là gì

Trong class C++, chúng ta sử dụng các access modifier để quyết định quyền truy cập vào các dữ liệu chứa trong nó, trong đó cần chú ý nhất là public - quyền truy cập công khai và private- quyền truy cập riêng tư.

Ví dụ đối với một biến thành viên của class ở dạng private, khi đó chúng ta chỉ có thể truy cập vào nó ở bên trong phạm vi class mà thôi. Do nó là riêng tư, không công khai nên chúng ta không thể truy cập từ ngoài class vào biến đó được.

Vấn đề đặt ra là, khi cần phải truy cập một biến riêng tư từ bên ngoài, mà không muốn thay đổi quyền truy cập tới biến đó thì chúng ta cần phải làm thế nào? Và đó là lý do mà chức năng Friend trong C++ đã ra đời.

Friend là một chức năng rất quan trọng trong C++, giúp cho phép một hàm hay một class có quyền truy cập vào một thành viên riêng tư của một class khác.

Nhờ có chức năng friend mà các hàm và class có thể dùng chúng dữ liệu riêng tư của một class có sẵn, qua đó rút gọn thời gian viết code và nâng cao hiệu suất phát triển phần mềm.

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

Khái niệm và cú pháp lớp bạn (Friend class) trong C++

Giống như vậy, một friend class trong C++ hay còn gọi là lớp bạn trong C++, chính là một class có quyền truy cập vào một thành viên riêng tư (private) của một class khác.

Để chỉ định một class làm lớp bạn của một class sẵn có, chúng ta viết cụm từ khóa friend class và tên của friend class này vào class sẵn có, với cú pháp sau đây:

class BaseClass
{
friend class FriendClass;
};

class FriendClass
{
};

Trong đó BaseClass là class ban đầu, và FriendClass là lớp bạn của nó.

Ví dụ cụ thể:

/*Khai báo class nguồn*/
class BaseClass{
private:
string m_b;
public:
BaseClass()
{
m_b = "BaseClass called";
}
//Chỉ định class bạn của BaseClass là FriendClass
friend class FriendClass;
};

/*Khai báo class bạn của class nguồn*/
class FriendClass{
public:
void print(BaseClass arg)
{
cout<<arg.m_b;
}
};

Trong ví dụ trên, FriendClass là class bạn của BaseClass, do vậy nó có quyền truy cập vào biến private của BaseClass là biến m_b.

Sử dụng lớp bạn (Friend class) trong C++

Khi sử dụng Lớp bạn (Friend class) trong C++, chúng ta sẽ truy cập vào biến private của lớp nguồn từ lớp bạn.

Để làm được điều đó, chúng ta cần tạo ra các đối tượng (instance) tương ứng của 2 class này, rồi dùng các hàm thành viên của lớp bạn để truy cập vào biến private của lớp nguồn như ví dụ sau đây:

#include <iostream>  
using namespace std;

/*Khai báo class nguồn*/
class BaseClass{
private:
string m_b;
public:
BaseClass()
{
m_b = "BaseClass called";
}
friend class FriendClass;
};

/*Khai báo class bạn của class nguồn*/
class FriendClass{
public:
void print(BaseClass arg)
{
cout<<arg.m_b;
}
};
int main()
{
/*Tạo instance của class nguồn và class bạn*/
BaseClass b;
FriendClass f;

/*Truy cập vào biến private của lớp nguồn*/
f.print(b);//BaseClass called
return 0;
}

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

Khái niệm và cú pháp hàm bạn (Friend function) trong C++

Tương tự như lớp bạn thì một friend function trong C++ hay còn gọi là hàm bạn trong C++, chính là một hàm có quyền truy cập vào một thành viên riêng tư của một class có sẵn.

Để chỉ định một hàm làm hàm bạn của một class sẵn có, chúng ta viết từ khóa friend đằng trước phần khai báo hàm này vào class nguồn, với cú pháp sau đây:

class MyClass
{
friend void func(MyClass obj);
};

void func(MyClass obj)
{
};

Trong đó MyClass là tên class ban đầu, obj là đối tượng tạo bởi class và func là hàm bạn của class đó.

Lưu ý khi chỉ định tham số của hàm, chúng ta viết func(MyClass obj) để truyền đối tượng được tạo từ class vào trong hàm. Lý do là để truy cập vào biến private thì cần phải tạo ra đối tượng (instance) chứa biến private đó. Và hàm sẽ thao tác với đối tượng này để truy cập vào biến private.

Sử dụng hàm bạn (Friend function) trong C++

Ví dụ cụ thể:

#include <iostream>  
using namespace std;

/*Khai báo class*/
class MyClass
{
private:
int num1, num2;
public:
/*Khai báo hàm tạo*/
MyClass(){num1 = 10; num2=20; }

//Chỉ định hàm bạn của class là hàm func
//với tham số là đối tượng ob tạo ra từ class
friend void func(MyClass ob);
};


/*Khai báo hàm func, với tham số là đối tượng tạo từ class*/
void func(MyClass ob)
{
cout<< ob.num1 + ob.num2;
}


int main()
{
/*Tạo đối tượng (instance) từ class*/
MyClass c;

//Do là hàm bạn của class nên func có thể truy cập
//vào 2 biến private của class là num1 và num2 và tính tổng
func(c); //30
}

Trong ví dụ trên, FriendClass là class bạn của BaseClass, do vậy nó có quyền truy cập vào biến private của BaseClass là biến m_b.

Hàm bạn của class nằm trong một class khác

Ở phần trên chúng ta đã học cách dùng một hàm bạn của class khi hàm đó được khai báo độc lập.

Tuy nhiên cũng có những trường hợp hàm bạn này lại được khai báo ở bên trong của một class khác.

Khi đó, ngoài việc chỉ định hàm bạn của class, chúng ta cũng cần phải chỉ định thêm class chứa hàm bạn đó cũng là lớp bạn của class ban đầu.

Ví dụ cụ thể:

#include <iostream>  
using namespace std;

class MyClass
{
private:
int num1, num2;
public:
MyClass(){num1 = 10; num2=20; }


friend class FriendClass; //Chỉ định class FriendClass là hàm bạn của class
friend void func(MyClass ob); //Chỉ định hàm func là hàm bạn của class
};

/*Khai báo class chứa hàm bạn của class MyClass*/
class FriendClass{
public:
void func(MyClass ob)
{
cout<< ob.num1 + ob.num2;
}
};

int main()
{
MyClass c;
FriendClass d;
d.func(c); //30
}

Nếu chúng ta bỏ qua việc chỉ định class chứa hàm bạn cũng là lớp bạn của class ban đầu, kết quả lỗi chương trình sẽ bị xảy ra.

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về friend trong C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.