下面給出C++類的友元機制說明(對類private、protected成員訪問),須要注意的是,友元機制儘可能不用或者少用,雖然它會提供某種程度的效率,但會帶來數據安全性的問題。ios
友元是C++提供的一種破壞數據封裝和數據隱藏的機制。程序員
經過將一個模塊聲明爲另外一個模塊的友元,一個模塊可以引用到另外一個模塊中本是被隱藏的信息。能夠使用友元函數和友元類。安全
爲了確保數據的完整性,及數據封裝與隱藏的原則,建議儘可能不使用或少使用友元。函數
友元函數是在類聲明中由關鍵字friend修飾說明的非成員函數,在它的函數體中可以經過對象名訪問 private 和protected成員spa
做用:增長靈活性,使程序員能夠在封裝和快速性方面作合理選擇。code
訪問對象中的成員必須經過對象名。對象
1 #include <iostream> 2 3 #include <cmath> 4 5 using namespace std; 6 7 class Point 8 {//Point類聲明 9 10 public: //外部接口 11 12 Point(int x=0, int y=0) : x(x), y(y) { } 13 14 int getX() { return x; } 15 16 int getY() { return y; } 17 18 friend float dist(Point &a, Point &b); 19 20 private: //私有數據成員 21 22 int x, y; 23 24 }; 25 26 float dist( Point& a, Point& b) 27 { 28 double x = a.x - b.x; 29 30 double y = a.y - b.y; 31 32 return static_cast<float>(sqrt(x * x + y * y)); 33 34 } 35 36 int main() 37 { 38 39 Point p1(1, 1), p2(4, 5); 40 41 cout <<"The distance is: "; 42 43 cout << dist(p1, p2) << endl; 44 45 return 0; 46 47 }
若一個類爲另外一個類的友元,則此類的全部成員都能訪問對方類的私有成員。blog
聲明語法:將友元類名在另外一個類中使用friend修飾說明。接口
若是聲明B類是A類的友元,B類的成員函數就能夠訪問A類的私有和保護數據,但A類的成員函數卻不能訪問B類的私有、保護數據。get