Hàm Bạn Và Lớp Bạn Trong C++

This entry is part 5 of 10 in the series

83 / 100

This entry is part 5 of 10 in the series Hướng đối tượng người dùng C + +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 thuần. Trong phần tiếp theo, tất cả chúng ta cùng đi khám phá 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 masinhvienprivate. 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ớ những quyền truy vấn private, protected, public những bạn hoàn toàn có thể xem lại TẠI ĐÂY

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

Hàm Bạn

Đị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ụ :

0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263

#include

usingnamespacestd;

classgiangvien;

classsinhvien

{

private:

stringmasinhvien;

public:

sinhvien()

{

this->masinhvien=” “;

}

~sinhvien()

{

this->masinhvien=” “;

}

voidset()

{

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

}

friendvoidget(sinhviena,giangvienb);/ / Khai báo hàm bạn trong class

};

classgiangvien

{

private:

stringmagiangvien;

public:

giangvien()

{

this->magiangvien=” “;

}

~giangvien()

{

this->magiangvien=” “;

}

voidset()

    

{

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

}

friendvoidget(sinhviena,giangvienb);/ / Khai báo hàm bạn trong class

};

voidget(sinhviena,giangvienb)

{

cout<<" Ma Sinh Vien : "<

cout<<" Ma Giang Vien : "<

}

intmain()

{

sinhviena;

giangvienb;

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

get(a,b);

}

Ta truyền Input :

0123 MSV001MGV001

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

0123 Ma Sinh Vien : MSV001Ma Giang Vien : MGV001

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

Lớp Bạn

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.

0123456789101112131415161718

classA

{

private:

inti;

public:

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

};

classB

{

public:

voidChange(Aobj)

{

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 quan điểm, góp phần của những bạn để bài viết của mình ngày càng hoàng thiện hơn. Cảm ơn tổng thể mọi người .