網頁

2022/8/17

C++ friend類別用法

C++的friend類別(friend class)用法如下。


Friend類別的函式可存取被宣告為friend的類別的private及protected的成員。

宣告friend類別的語法如下:

  • ClassName - 宣告friend類別FriendClassName的類別名稱,此類別的private及protected成員可被FriendClassName類別存取。
  • friend - 宣告friend類別或friend函式的關鍵字。
  • FriendClassName - ClassName類別的friend類別名稱。
class ClassName {
    friend class FriendClassName;
}

例如下面的類別Car中宣告類別Scooter為friend類別,則Scooter的函式可直接存取Car的private即protected成員。

main.cpp

#include <iostream>
#include <string>
using namespace std;

class Car {
    friend class Scooter;

    private:
        string model;
        int speed;

    public:
        Car(string model, int speed) : model(model), speed(speed) {}
};

class Scooter {
    private:
        string model;
        int speed;

    public:
        Scooter(string model, int speed) : model(model), speed(speed) {}

        int CompareSpeed(Car& car) { return speed - car.speed; }
};

int main() {
    Car car = {"Tesla Model S", 100};
    Scooter scooter = {"Gogoro S", 80};

    cout << scooter.CompareSpeed(car) << endl; // -20

    return 0;
}

不過反過來Car並無法存取Scooter的private及protected成員,除非Scooter宣告Car為friend類別。

若兩類別互相宣告為friend類別,要注意類別及方法的宣告順序。

main.cpp

#include <iostream>
#include <string>
using namespace std;

class Scooter;

class Car {
    friend class Scooter;

    private:
        string model;
        int speed;

    public:
        Car(string model, int speed) : model(model), speed(speed) {}

        int CompareSpeed(Scooter& scooter);
};

class Scooter {
    friend class Car;

    private:
        string model;
        int speed;

    public:
        Scooter(string model, int speed) : model(model), speed(speed) {}

        int CompareSpeed(Car& car) { return speed - car.speed; }
};

int Car::CompareSpeed(Scooter& scooter) { return speed - scooter.speed; }

int main() {
    Car car = {"Tesla Model S", 100};
    Scooter scooter = {"Gogoro S", 80};

    cout << scooter.CompareSpeed(car) << endl; // -20
    cout << car.CompareSpeed(scooter) << endl; // 20

    return 0;
}


沒有留言:

張貼留言