Các hàm và lớp bạn bè trong C ++ (Có ví dụ)

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à các 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 tinbả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 friendtừ 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 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

 Khoảng cách: 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ưcông khai .

Mặc dù ví dụ này cho chúng ta một ý tưởng về khái niệm hàm bạn bè, 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 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

 Tổng: 13

Trong chương trình này, ClassAClassBđã khai báo add()là chức năng kết bạn. Do đó, hàm này có thể truy cập dữ liệu riêng 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 ClassBtạ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 khai báo trước ClassBtrong chương trình của mình.

 // 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 friendtừ 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.

classBlà 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 classAtừ 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 ClassBtừ 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 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

 Tổng: 13

Đây, ClassBlà một lớp bạn của ClassA. Vì vậy, ClassBcó 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.

ClassBlà lớp bạn nên chúng ta có thể tạo các đối tượng ClassAbên trong của ClassB.

thú vị bài viết...