C++类成员的访问权限以及类的封装
C++通過 public、protected、private 三個關鍵字來控制成員變量和成員函數的訪問權限,它們分別表示公有的、受保護的、私有的,被稱為成員訪問限定符。所謂訪問權限,就是你能不能使用該類中的成員。
C++ 中的 public、private、protected 只能修飾類的成員,不能修飾類,C++中的類沒有共有私有之分。在類的內部(定義類的代碼內部),無論成員被聲明為 public、protected 還是 private,都是可以互相訪問的,沒有訪問權限的限制。
在類的外部(定義類的代碼之外),只能通過對象訪問成員,并且通過對象只能訪問 public 屬性的成員,不能訪問 private、protected 屬性的成員。
通過 Student 類示例訪問權限:
#include <iostream> using namespace std;//類的聲明 class Student{ private: //私有的char *m_name;int m_age;float m_score;public: //共有的void setname(char *name);void setage(int age);void setscore(float score);void show(); };//成員函數的定義 void Student::setname(char *name){m_name = name; } void Student::setage(int age){m_age = age; } void Student::setscore(float score){m_score = score; } void Student::show(){cout<<m_name<<"的年齡是"<<m_age<<",成績是"<<m_score<<endl; }int main(){//在棧上創建對象Student stu;stu.setname("小王");stu.setage(15);stu.setscore(92.5f);stu.show();//在堆上創建對象Student *pstu = new Student;pstu -> setname("小華");pstu -> setage(16);pstu -> setscore(96);pstu -> show();return 0; }運行結果:
小王的年齡是15,成績是92.5 小華的年齡是16,成績是96類的聲明和成員函數的定義都是類定義的一部分,在實際開發中,我們通常將類的聲明放在頭文件中,而將成員函數的定義放在源文件中。
類中的成員變量 m_name、m_age 和m_ score 被設置成 private 屬性,在類的外部不能通過對象訪問。也就是說,私有成員變量和成員函數只能在類內部使用,在類外都是無效的。
成員函數 setname()、setage() 和 setscore() 被設置為 public 屬性,是公有的,可以通過對象訪問。
private 后面的成員都是私有的,直到有 public 出現才會變成共有的;public 之后再無其他限定符,所以 public 后面的成員都是共有的。
以 setname() 為例,如果將成員變量m_name的名字修改為name,那么 setname() 的形參就不能再叫name了,得換成諸如name1、_name這樣沒有明顯含義的名字,否則name=name;這樣的語句就是給形參name賦值,而不是給成員變量name賦值。
因為三個成員變量都是私有的,不能通過對象直接訪問,所以必須借助三個 public 屬性的成員函數來修改它們的值。
類的封裝
private 關鍵字的作用在于更好地隱藏類的內部實現,該向外暴露的接口(能通過對象訪問的成員)都聲明為 public,不希望外部知道、或者只在類內部使用的、或者對外部沒有影響的成員,都建議聲明為 private。
根據C++軟件設計規范,實際項目開發中的成員變量以及只在類內部使用的成員函數(只被成員函數調用的成員函數)都建議聲明為 private,而只將允許通過對象調用的成員函數聲明為 public。
另外還有一個關鍵字 protected,聲明為 protected 的成員在類外也不能通過對象訪問,但是在它的派生類內部可以訪問。
有的人心里產生了新的疑問,將成員變量都聲明為 private,如何給它們賦值呢,又如何讀取它們的值呢?
我們可以額外添加兩個 public 屬性的成員函數,一個用來設置成員變量的值,一個用來獲取成員變量的值。上面的代碼中,setname()、setage()、setscore() 函數就用來設置成員變量的值;如果希望獲取成員變量的值,可以再添加三個函數 getname()、getage()、getscore()。
給成員變量賦值的函數通常稱為 set 函數,它們的名字通常以set開頭,后跟成員變量的名字;讀取成員變量的值的函數通常稱為 get 函數,它們的名字通常以get開頭,后跟成員變量的名字。
這種將成員變量聲明為 private、將部分成員函數聲明為 public 的做法體現了類的封裝性。所謂封裝,是指盡量隱藏類的內部實現,只向用戶提供有用的成員函數。
private和public的解說
聲明為 private 的成員和聲明為 public 的成員的次序任意,既可以先出現 private 部分,也可以先出現 public 部分。如果既不寫 private 也不寫 public,就默認為 private。
在一個類體中,private 和 public 可以分別出現多次。每個部分的有效范圍到出現另一個訪問限定符或類體結束時(最后一個右花括號)為止。但是為了使程序清晰,應該養成這樣的習慣,使每一種成員訪問限定符在類定義體中只出現一次。
類聲明也示例:
class Student{ private:char *m_name; private:int m_age;float m_score; public:void setname(char *name);void setage(int age); public:void setscore(float score);void show(); };總結
以上是生活随笔為你收集整理的C++类成员的访问权限以及类的封装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java通过反射访问构造方法
- 下一篇: C++ queue和priority_q