中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中友元是什么意思

發布時間:2022-03-08 14:45:39 來源:億速云 閱讀:145 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關C++中友元是什么意思,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

    一.友元函數

    友元函數可以是普通函數或者類成員函數。

    先看普通函數聲明為友元函數:

    如下所示:

    #include <iostream>
    #include <cmath>
    using namespace std;
    class Point
    {
        //普通函數聲明為類的友元函數
    	friend double TwoPointsDistant(const Point& pnt1, const Point& pnt2);
    public:
    	Point(double x=0, double y=0)
    		:_x(x), _y(y)
    	{}
    	double getPointXAxis() const { return this->_x; }
    	double getPointYAxis() const { return this->_y; }
    private:
    	double _x;
    	double _y;
    };
    //計算兩點的距離
    double TwoPointsDistant(const Point& pnt1, const Point& pnt2)
    {
    	return sqrt(  pow((pnt1._x - pnt2._x), 2) + pow((pnt1._y - pnt2._y), 2)   );
    }
    int main()
    {
    	Point point1(1.1,2.2);
    	Point point2(3.3, 4.4);
    	cout << TwoPointsDistant(point1, point2) << endl;
    	system("pause");
    	return 0;
    }

    這里說明一點:TwoPointsDistant()函數必須在Point類的定義下面,至于原因,很簡單,你若放在Point上面,Point的數據成員_x和_y都沒定義呢,你用個錘子。

    再看類成員函數聲明為友元函數:

    還以上面的類為例,現在加一個_PointMove_類,它有一個成員函數_PointAxisAddOne,_作用是將點的坐標都加1。如下:

    class PointMove
    {
    public:
    	void PointAxisAddOne(Point& pnt);
    };

    這里就出現了一個問題:_Point_和_PointMove_哪個放在前面?先給出答案,應該把_PointMove_放在前面,并且是必須的,如下:

    class Point;//前向聲明Point
    class PointMove
    {
    public:
    	void PointAxisAddOne(Point& pnt);
    };
    class Point
    {
        //普通函數聲明為類的友元函數
    	friend double TwoPointsDistant(const Point& pnt1, const Point& pnt2);
        //類成員函數聲明為友元
    	friend void PointMove::PointAxisAddOne(Point& pnt);
        /*這里同前*/
    };
    //類成員函數的定義
    void PointMove::PointAxisAddOne(Point& pnt)
    {
    	pnt._x = pnt._x + 1;
    	pnt._y = pnt._y + 1;
    }

    這里注意,對于類的成員函數,聲明為其他類的友元函數時需要加上類的作用域,即指出該函數屬于哪個類。如上面的_PointMove::_。

    同時,需要說明的是,PointAxisAddOne()函數的定義是必須放在Point類定義后面的,這和普通函數的道理是一樣的。

    最后說明

    1.一個函數Func被聲明為類A的友元函數,那么是不能直接使用this指針來訪問類A的數據成員的(當然,若Func是類B的成員函數,它可以通過this訪問類B的數據成員),這和成員函數不同。

    2.一個函數Func為什么要聲明為某個類A的友元,就是因為函數的參數類型為類A類型,我想訪問這個類對象的數據成員,所以被聲明為類A的友元函數的參數類型必定為類A,如friend Func(A& obj);

    二.友元類

    若是將一個類C都聲明為另一個類A的友元類,則類C中的成員函數均可訪問類A中的私有數據成員。如下:

    class Point
    {
        //友元類
        friend class PointInfo;
        ...
    }
    class PointInfo
    {
    public:
    	//打印點所處象限
    	void PrintQuadrant(const Point& pnt) const
    	{
    		if (pnt._x > 0 && pnt._y > 0)
    			cout << "點"<<"(" << pnt._x << "," << pnt._y<<")" <<"處于第一象限" << endl;
    	}
    };

    當然,你也可以把_PointInfo_寫在_Point_前,只是函數_PrintQuadrant()_的定義就不能在類內實現了,只能在_Point_后實現,原因和前面一樣,不再贅述。

    三.完整示例:

    #include <iostream>
    #include <cmath>
    using namespace std;
    class Point;
    class PointMove
    {
    public:
    	void PointAxisAddOne(Point& pnt);
    };
    class PointInfo
    {
    public:
    	//打印點所處象限
    	void PrintQuadrant(const Point& pnt) const;
    };
    class Point
    {
    	friend class PointInfo;
    	friend double TwoPointsDistant(const Point& pnt1, const Point& pnt2);
    	friend void PointMove::PointAxisAddOne(Point& pnt);
    public:
    	Point(double x=0, double y=0)
    		:_x(x), _y(y)
    	{}
    	double getPointXAxis() const { return this->_x; }
    	double getPointYAxis() const { return this->_y; }
    	void PrintAxis(const Point& pnt) const
    	{
    	}
    private:
    	double _x;
    	double _y;
    };
    //打印點所處象限
    void PointInfo::PrintQuadrant(const Point& pnt) const
    {
    	if (pnt._x > 0 && pnt._y > 0)
    	cout << "點"<<"(" << pnt._x << "," << pnt._y<<")" <<"處于第一象限" << endl;
    }
    void PointMove::PointAxisAddOne(Point& pnt)
    {
    	pnt._x = pnt._x + 1;
    	pnt._y = pnt._y + 1;
    }
    double TwoPointsDistant(const Point& pnt1, const Point& pnt2)
    {
    	return sqrt(  pow((pnt1._x - pnt2._x), 2) + pow((pnt1._y - pnt2._y), 2)   );
    }
    int main()
    {
    	Point point1(1.1,2.2);
    	Point point2(3.3, 4.4);
    	cout << TwoPointsDistant(point1, point2) << endl;
    	PointInfo pf;
    	pf.PrintQuadrant(point1);
    	system("pause");
    	return 0;
    }

    VS2015打印結果:

    C++中友元是什么意思

    四.同一個類(class)的類對象(object)互為友元

    還以上面給出的例子為基礎,現在在_Point_類加一個成員函數func(const Point& pnt),它返回點的x軸和y軸的和。如下所示。

    class Point
    {
        /*這里同上*/
    	double func(const Point& pnt)
    	{
    		return pnt._x + pnt._y;
    	}
    private:
    	double _x;
    	double _y;
    };

    現在我生成兩個對象,并作如下操作:

    	Point point1(1.1,2.2);
    	Point point2(3.3, 4.4);
    	cout << point1.func(point2) << endl;

    最后的結果是打印出7.7。看到這里不知道你有沒有疑問:為什么可以通過point1直接訪問point2的私有數據成員,而沒有將func()聲明為友元函數?侯捷老師是這么解釋的:相同class的各個objects之間互為友元。

    所以對于一個類A,若有一個成員函數Fun(A& arg),可以通過arg直接訪問A的私有數據成員。

    關于“C++中友元是什么意思”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    c++
    AI

    美姑县| 东莞市| 自治县| 安阳县| 黄陵县| 千阳县| 施秉县| 北碚区| 灵丘县| 日土县| 三明市| 丰原市| 四会市| 高清| 滁州市| 凤庆县| 黎川县| 白朗县| 历史| 通州市| 潮州市| 永年县| 安吉县| 武鸣县| 临高县| 石棉县| 凤山县| 郧西县| 樟树市| 大同市| 定西市| 曲水县| 上高县| 都安| 咸丰县| 常州市| 客服| 巴中市| 霸州市| 凤山县| 天水市|