C++ primer 第七章之 友元函数与友元类
生活随笔
收集整理的這篇文章主要介紹了
C++ primer 第七章之 友元函数与友元类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.為什么需要友元函數??
- 類具有封裝和信息隱藏的特性:
- 只有類的成員函數才能訪問類的私有成員,程序中的其他函數是無法訪問私有成員的 ;
- 非成員函數可以訪問類中的公有成員,但是如果將數據成員都定義為公有的,又破壞了隱藏的特性 ;
- 友元是一種定義在類外部的普通函數,但它需要在類體內進行聲明.在說明時前面加以關鍵字?friend ;
- 友元不是成員函數,但它可以訪問類中的私有成員 ;
#include <iostream>
#include <math.h>
using namespace std;
class Point{
public:Point(double xx, double yy) { x=xx; y=yy; }//構造函數void Getxy();//聲明一個普通成員函數friend double Distance(Point &a, Point &b);//將一個普通函數聲明成友元
private:double x, y;
};void Point::Getxy(){cout<< "x:"<< this->x << " "<<"y:" <<this->y<<endl;
}
double Distance(Point &a, Point &b){double dx = a.x - b.x;double dy = a.y - b.y;return sqrt(dx*dx+dy*dy);
}
/*
說明:在該程序中的Point類中說明了一個友元函數Distance(),它在說明時前邊加friend關鍵字,標識它不是成員函數,而是友元函數。
它的定義方法與普通函數定義一樣,而不同于成員函數的定義,因為它不需要指出所屬的類。
但是,它可以引用類中的私有成員,函數體中 a.x,b.x,a.y,b.y都是類的私有成員,它們是通過對象引用的。
在調用友元函數時,是同普通函數的調用一樣,不要像成員函數那樣調用.
*/
int main()
{Point p1(3.0, 4.0), p2(6.0, 8.0);p1.Getxy();p2.Getxy();double d = Distance(p1, p2);cout<<"Distance is "<< d <<endl;return 0;
}
?
注:別的類的成員函數作友元,也就是2個類相互調用,無論誰定義在前在后,編譯時都有沖突.
要解決這個問題:將類的聲明、定義分開.
?
2.友元類
友元類:一個類A可以作另一個類B的友元.意味著這個類A的所有成員函數都是另一個類B的友元函數
?
class B{//...friend class A; //聲明 A是B的友元類//...
};class A{//...}; ?
使用友元類時注意:
- 友元關系不能被繼承;
- 友元關系是單向的,不具有交換性:若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的聲明;
- 友元關系不具有傳遞性:若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明;
#include <iostream> using namespace std; class CObj { public: CObj() : mX(0), mY(0) {} friend class CFriend; private: void PrintData() const { cout << "mX = " << mX << endl << "mY = " << mY << endl; } int mX; int mY; }; class CFriend { public: CFriend(int x, int y) { mObj.mX = x; //直接調用類CObj的私有數據成員 mObj.mY = y; } void ShowData() const { mObj.PrintData(); //直接調用類CObj的私有成員函數 } private: CObj mObj; }; int main() { CFriend one(3, 4); one.ShowData(); return 0; }
?
轉載于:https://www.cnblogs.com/chenjz1993/p/6753454.html
總結
以上是生活随笔為你收集整理的C++ primer 第七章之 友元函数与友元类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 塑钢门窗多少钱一平米
- 下一篇: 蛇毒多少钱啊?