首頁 >後端開發 >C++ >C++ 友元函數與存取控制的衝突

C++ 友元函數與存取控制的衝突

王林
王林原創
2024-04-16 18:09:01657瀏覽

在 C 中,友元函數與存取控制可能會衝突。若要存取私有成員,可以將成員宣告為受保護或使用代理函數。例如,Student 類別有私有成員 name 和 score,友元函數 printName 和 printScore 可分別列印這些成員。

C++ 友元函数与访问控制的冲突

C 友元函數與存取控制的衝突

在C 中,友元函數是可以存取類別私有成員的非成員函數。但是,當涉及到存取控制時,友元函數可能會遇到與類別成員存取控制的衝突。

存取控制

C 提供了三種存取控制層級:

  • public: 可從類別的任何地方訪問。
  • protected: 只能從類別及其衍生類別中存取。
  • private: 只能從類別內部存取。

友元函數

友元函數是透過 friend 關鍵字宣告的。友元函數可以存取類別的所有成員,無論存取控制層級為何。但是,友元函數不會成為類別的一部分。

存取控制衝突

當友元函數試圖存取私有成員時,就會發生存取控制衝突。例如:

class MyClass {
private:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};

在這個範例中,printX 函數是類別的友元,但它試圖存取私有成員 x。這會導致編譯器錯誤。

解決衝突

要解決存取控制衝突,可以使用下列方法:

1. 使用保護成員

#將私有成員宣告為受保護成員。這允許衍生類別和友元函數存取該成員。

class MyClass {
protected:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};

2. 使用代理函數

建立另一個類別成員函數作為私有成員的代理。這個代理函數可以公開訪問,供友元函數使用。

class MyClass {
private:
    int x;

public:
    int getX() const { return x; }

friend void printX(MyClass& obj) {
    std::cout << obj.getX() << std::endl;
}
};

實戰案例

在以下實際案例中,我們有一個Student 類,它有namescore兩個私有成員。我們想要建立兩個友元函數 printName()printScore(),用來分別列印這些私有成員。

class Student {
private:
    std::string name;
    int score;

friend void printName(Student& obj) {
    std::cout << "Name: " << obj.name << std::endl;
}

friend void printScore(Student& obj) {
    std::cout << "Score: " << obj.score << std::endl;
}
};

使用友元函數,我們可以輕鬆地列印學生的姓名和成績,即使它們是私有成員。

int main() {
    Student student;
    student.name = "John Doe";
    student.score = 95;

    printName(student);
    printScore(student);

    return 0;
}

輸出:

Name: John Doe
Score: 95

以上是C++ 友元函數與存取控制的衝突的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn