Hàm friend trong C++

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 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 <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, ClassAvà 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 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 một khai báo trước ClassBtrong 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 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.

Vì 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 <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, 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 .

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









Gõ tìm kiếm nhanh...