Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Lớp bạn (Friend class) và hàm bạn (Friend function) trong C++

Hàm bạn (friend function) của một lớp được định nghĩa bên ngoài phạm vi của lớp đó nhưng có quyền truy cập tất cả các thành viên private và protected của lớp. Dù nguyên mẫu hàm bạn xuất hiện trong định nghĩa lớp, chúng không phải là hàm thành viên.

Một friend có thể là hàm, hàm mẫu (function template), hàm thành viên, hoặc một lớp/lớp mẫu, trong trường hợp này toàn bộ lớp và tất cả thành viên của nó đều là friend.

Để khai báo một hàm là friend của một lớp, đặt từ khóa friend trước nguyên mẫu hàm trong định nghĩa lớp như sau:

class Box {
    double width;
public:
    double length;
    friend void printWidth(Box box);
    void setWidth(double wid);
};

Để khai báo tất cả hàm thành viên của lớp ClassTwo là friend của lớp ClassOne, đặt khai báo sau trong định nghĩa ClassOne:

friend class ClassTwo;

Ví dụ

#include <iostream>
using namespace std;

class Box {
    double width;
public:
    friend void printWidth(Box box);
    void setWidth(double wid);
};

// Định nghĩa hàm thành viên
void Box::setWidth(double wid) {
    width = wid;
}

// Lưu ý: printWidth() không phải hàm thành viên của bất kỳ lớp nào
void printWidth(Box box) {
    /* Vì printWidth() là friend của Box, nó có thể
       truy cập trực tiếp bất kỳ thành viên nào của lớp này */
    cout << "Width of box: " << box.width << endl;
}

int main() {
    Box box;
    // Thiết lập độ rộng mà không dùng hàm thành viên
    box.setWidth(10.0);
    // Dùng hàm bạn để in độ rộng
    printWidth(box);
    return 0;
}

Kết quả

Width of box: 10

Dù hàm không phải thành viên của lớp, nó vẫn có thể truy cập trực tiếp các biến thành viên của lớp đó. Điều này rất hữu ích trong một số tình huống.