Trong hướng dẫn này, chúng ta sẽ học cách tạo các hàm bạn bè và các lớp bạn bè trong C ++ với sự trợ giúp của các ví dụ.
Ẩn dữ liệu là một khái niệm cơ bản của lập trình hướng đối tượng. Nó hạn chế quyền truy cập của các thành viên riêng tư từ bên ngoài của lớp học.
Tương tự, các thành viên được bảo vệ chỉ có thể được truy cập bởi các lớp dẫn xuất và không thể truy cập từ bên ngoài. Ví dụ,
class MyClass {
private:
int member1;
}
int main() {
MyClass obj;
// Error! Cannot access private members from here.
obj.member1 = 5;
}
Tuy nhiên, có một tính năng trong C ++ được gọi là hàm bạn bè phá vỡ quy tắc này và cho phép chúng ta truy cập các hàm thành viên từ bên ngoài lớp.
Tương tự, có một lớp bạn bè , chúng ta sẽ tìm hiểu ở phần sau của hướng dẫn này.
Hàm friend trong C ++
Một chức năng bạn có thể truy cập vào tin và bảo vệ dữ liệu của một lớp. Chúng ta khai báo một hàm friend bằng cách sử dụng friend
từ khóa bên trong phần thân của lớp.
class className {
... .. ...
friend returnType functionName(arguments);
... .. ...
}
Ví dụ 1: Làm việc của bạn bè Chức năng
// C++ program to demonstrate the working of friend function
#include <iostream>
using namespace std;
class Distance {
private:
int meter;
// friend function
friend int addFive(Distance);
public:
Distance() : meter(0) {}
};
// friend function definition
int addFive(Distance d) {
//accessing private members from the friend function
d.meter += 5;
return d.meter;
}
int main() {
Distance D;
cout << "Distance: " << addFive(D);
return 0;
}
Đầu ra
Distance: 5
Ở đây, addFive()
là một chức năng kết bạn có thể truy cập cả thành viên dữ liệu riêng tư và công khai .
Mặc dù ví dụ này cho chúng ta một ý tưởng về khái niệm chức năng kết bạn, nhưng nó không cho thấy bất kỳ cách sử dụng có ý nghĩa nào.
Một cách sử dụng có ý nghĩa hơn sẽ là hoạt động trên các đối tượng của hai lớp khác nhau. Đó là khi chức năng kết bạn có thể rất hữu ích.
Ví dụ 2: Thêm thành viên của hai lớp khác nhau
// Add members of two different classes using friend functions
#include <iostream>
using namespace std;
// forward declaration
class ClassB;
class ClassA {
public:
// constructor to initialize numA to 12
ClassA() : numA(12) {}
private:
int numA;
// friend function declaration
friend int add(ClassA, ClassB);
};
class ClassB {
public:
// constructor to initialize numB to 1
ClassB() : numB(1) {}
private:
int numB;
// friend function declaration
friend int add(ClassA, ClassB);
};
// access members of both classes
int add(ClassA objectA, ClassB objectB) {
return (objectA.numA + objectB.numB);
}
int main() {
ClassA objectA;
ClassB objectB;
cout << "Sum: " << add(objectA, objectB);
return 0;
}
Đầu ra
Sum: 13
Trong chương trình này, ClassA
và ClassB
đã khai báo add()
là chức năng kết bạn. Do đó, chức năng này có thể truy cập dữ liệu riêng tư của cả hai lớp.
Một điều cần lưu ý ở đây là chức năng bạn bè bên trong ClassA
đang sử dụng ClassB
. Tuy nhiên, chúng tôi chưa xác định ClassB
tại thời điểm này.
// inside classA
friend int add(ClassA, ClassB);
Để điều này hoạt động, chúng tôi cần một khai báo trước ClassB
trong chương trình của chúng tôi.
// forward declaration
class ClassB;
Bạn bè Lớp trong C ++
Chúng ta cũng có thể sử dụng lớp friend trong C ++ bằng cách sử dụng friend
từ khóa. Ví dụ,
class ClassB;
class ClassA {
// ClassB is a friend class of ClassA
friend class ClassB;
... .. ...
}
class ClassB {
... .. ...
}
Khi một lớp được khai báo là lớp bạn, tất cả các hàm thành viên của lớp bạn sẽ trở thành hàm bạn.
Vì ClassB
là một lớp học bạn bè, chúng tôi có thể truy cập tất cả các thành viên của ClassA
từ bên trong ClassB
.
Tuy nhiên, chúng tôi không thể truy cập các thành viên của ClassB
từ bên trong ClassA
. Đó là bởi vì quan hệ bạn bè trong C ++ chỉ được cấp, không được lấy.
Ví dụ 3: Lớp bạn C ++
// C++ program to demonstrate the working of friend class
#include <iostream>
using namespace std;
// forward declaration
class ClassB;
class ClassA {
private:
int numA;
// friend class declaration
friend class ClassB;
public:
// constructor to initialize numA to 12
ClassA() : numA(12) {}
};
class ClassB {
private:
int numB;
public:
// constructor to initialize numB to 1
ClassB() : numB(1) {}
// member function to add numA
// from ClassA and numB from ClassB
int add() {
ClassA objectA;
return objectA.numA + numB;
}
};
int main() {
ClassB objectB;
cout << "Sum: " << objectB.add();
return 0;
}
Đầu ra
Sum: 13
Đây, ClassB
là một lớp bạn của ClassA
. Vì vậy, ClassB
có quyền truy cập vào các thành viên của classA
.
Trong ClassB
, chúng ta đã tạo một hàm add()
trả về tổng của numA và numB .
Vì ClassB
là một lớp bạn, chúng ta có thể tạo các đối tượng ClassA
bên trong của ClassB
.