友元函數 友元函數分為友元全局函數和友元成員函數。 下面是一個友元全局函數的例子:
class Coordinate{ friend void PRintXY(Coordinate &c);public: Coordinate(int x, int y);private: int m_iX; int m_iY;};友元函數的應用
void printXY(Coordinate &c){ cout << c.m_iX << c.m_iY << endl;//友元函數可以順利訪問private}int main(){ Coordinate coor(3, 5); printXY(coor);//傳入對象名而非地址 return 0;}下面是友元成員函數的例子
class Coordinate{ friend void Circle::printXY(Coordinate &c);//是Circle類的成員函數public: Coordinate(int x, int y);private: int m_iX; int m_iY;};class Circle{ void printXY(Coordinate &c) { cout << c.m_iX << c.m_iY << endl; }};int main(){ Coordinate coor(3, 5); Circle circle; circle.printXY(coor);//傳入對象名而非地址 return 0;}友元函數也存在一定的風險,在上述代碼中,通過成員函數很方便的訪問Coordinate的私有成員,很方便,但同時也破壞了它的封裝性,當不小心改了這個值以后,也很不容易察覺。
友元類 友元類的聲明和友元函數的聲明很相似,如下述代碼
class Circle;//要告訴計算機,這個類是定義過的class Coordinate{ friend Circle;public: Coordinate(int x, int y);private: int m_iX; int m_iY;};在實現Circle類的時候,可以在類中數據成員中包含一個友元的類,并調用其私有成員,如下述代碼所示
class Circle{public: void printXY(c) { cout << c.m_iX << c.m_iY << endl; }private: Coordinate m_coor;};接下來我們來講一下友元的注意事項 1.友元關系不可傳遞 2.友元關系的單向性 3.友元聲明的形式和數量不受限制 最后我們需要知道的是友元只是封裝的補充,其本身并不是一個很好的語法。友元破壞了類的封裝性,所以盡量不要用友元。
靜態 (static) C++中的靜態分為靜態數據成員和靜態成員函數。 靜態數據成員依賴于類,而不依賴于對象,這意思就是說靜態數據成員即使不實例化,在內存中也存在,他不需要在構造函數中實例化,它的實例化往往是單獨進行的,而普通的數據成員不實例化就不存在,如下述代碼:
class Tank{public: Tank(){ s_iCount++; }//產生新坦克,則坦克數增多 ~Tank(){ s_iCount--; } static int getCount(){ return s_iCount; }//靜態成員函數 static int s_iCount; //靜態數據成員,記錄了我方坦克的數量private: string m_strCode;};int Tank::s_iCount = 0;//不需要再加關鍵字static那么作為訪問方法來說有兩種,一種是不通過類,而是直接通過對象的訪問方法;另一種是如果我們定義了對象,可以通過對象的方式來調用。如下代碼所示
int main(){ cout << Tank::getCount() << endl;//直接訪問 cout << Tank::s_iCount << endl; Tank tank; cout << tank.getCount() << endl;//通過對象訪問 cout << tank.s_iCount << endl; return 0;}靜態函數不能調用非靜態的成員,因為static成員一直存在,但是如果沒有實例化的話,就無法調用非靜態的成員。
靜態函數不能加const,因為const修飾的是this指針,靜態函數本身沒有this指針,所以不可能使用。
下面來說一下靜態的注意事項: 1.靜態數據成員必須進行單獨的初始化 2.靜態的成員函數不能調用非靜態的成員函數和非靜態的數據成員,反之可以。 3.靜態的數據成員只有一份,且不依賴于對象而存在。
新聞熱點
疑難解答
圖片精選