Pin-Jiun / Programming-Language-CPP

It's the note/experience about C++, and I have the basic ability of C.
0 stars 0 forks source link

7-Friend functions and classes #8

Open Pin-Jiun opened 1 year ago

Pin-Jiun commented 1 year ago

如何取用private/protected member?

假設今天有個Student class,但覺得Age是屬於隱私的狀態,想要進行存取但又保有隱私

class Student{
private:
    int Age;
public:
    string Name;
};
  1. 使用public getter去獲得此private/protected member,但這樣隱私有點被破壞
  2. 使用friend fuction 去分享給別人,變成global function

Friend functions

friend return_type f(class_Name); 使用friend修飾的function必須在class外實作

class Student{
private:
    int Age;

public:
    //declare friend function
    friend void PrintAge(Student);
    string Name;
    Student(string name, int age){
    Name = name;
    Age = age;
  }
};

//實作fiend function
void PrintAge(Student someone){
    cout << someone.Name << " is " << someone.Age << " year-old.\n";
}

int main()
{
    Student Amy("Amy",20);
    PrintAge(Amy);
}
Amy is 20 year-old.

但是要注意不能濫用friend修飾詞,否則會失去friend的意義


Friend classes

friend class Teacher 宣告你要把private的相關資料分享給Teacher這個class 所以teacher可以取用其private member

class Student{
private:
    int Age;

public:
    //declare friend class
    friend class Teacher;
    string Name;
    Student(string name, int age){
    Name = name;
    Age = age;
  }
};

class Teacher{
public:
    void PrintAge(Student someone){
    cout << someone.Name << " is " << someone.Age << " year-old.\n";
    }

};

int main()
{
    Student Amy("Amy",20);
    Teacher Bob;
    Bob.PrintAge(Amy);
}

此時Bob這個Teacher class 可以取得 Amy 這個 Student class的 private/protected成員

Amy is 20 year-old.