亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一篇文章詳細(xì)解釋C++的友元(friend)

 更新時間:2022年03月08日 11:18:42   作者:代碼烏龜  
這篇文章主要為大家詳細(xì)介紹了C++的友元(friend),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一.友元函數(shù)

友元函數(shù)可以是普通函數(shù)或者類成員函數(shù)。

先看普通函數(shù)聲明為友元函數(shù):

如下所示:

#include <iostream>
#include <cmath>
using namespace std;
class Point
{
    //普通函數(shù)聲明為類的友元函數(shù)
	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()函數(shù)必須在Point類的定義下面,至于原因,很簡單,你若放在Point上面,Point的數(shù)據(jù)成員_x和_y都沒定義呢,你用個錘子。

再看類成員函數(shù)聲明為友元函數(shù):

還以上面的類為例,現(xiàn)在加一個_PointMove_類,它有一個成員函數(shù)_PointAxisAddOne,_作用是將點的坐標(biāo)都加1。如下:

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

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

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

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

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

最后說明

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

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

二.友元類

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

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;
	}
};

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

三.完整示例:

#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打印結(jié)果:

打印結(jié)果

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

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

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

現(xiàn)在我生成兩個對象,并作如下操作:

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

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

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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++inline函數(shù)的特性你了解嗎

    C++inline函數(shù)的特性你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++的inline函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++單例模式的實例詳解

    C++單例模式的實例詳解

    這篇文章主要介紹了C++單例模式的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C++ const和指針詳情

    C++ const和指針詳情

    這篇文章主要介紹了C++ const和指針,關(guān)于使用const來修飾指針,有兩種不同的方式。第一種是讓指針指向一個常量對象,這樣可以防止使用該指針進(jìn)行修改指向的值。第二種則是將指針本身聲明為常量,可以防止改變指針指向的位置,下面來看看文章的詳細(xì)內(nèi)容
    2021-11-11
  • C語言 文件的隨機(jī)讀寫詳解及示例代碼

    C語言 文件的隨機(jī)讀寫詳解及示例代碼

    本文主要介紹C語言 文件的隨機(jī)讀寫,這里整理了相關(guān)資料及示例代碼以便大家學(xué)習(xí)參考,學(xué)習(xí)此部分內(nèi)容的朋友可以參考下
    2016-08-08
  • 探究在C++程序并發(fā)時保護(hù)共享數(shù)據(jù)的問題

    探究在C++程序并發(fā)時保護(hù)共享數(shù)據(jù)的問題

    這篇文章主要介紹了探究在C++程序并發(fā)時保護(hù)共享數(shù)據(jù)的問題,也有利于大家更好地理解C++多線程的一些機(jī)制,需要的朋友可以參考下
    2015-07-07
  • C++實現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表

    C++實現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語言基礎(chǔ)解析之分支與循環(huán)語句

    C語言基礎(chǔ)解析之分支與循環(huán)語句

    C語言是一門結(jié)構(gòu)化的程序設(shè)計語言,當(dāng)C語言用來描述生活中的事物時,會用到三種結(jié)構(gòu):順序結(jié)構(gòu)(不去贅述),選擇結(jié)構(gòu)(對應(yīng)分支語句),循環(huán)結(jié)構(gòu)(對應(yīng)循環(huán)語句),分支語句:分支語句分為兩種,一種是if語句,一種是switch語句
    2021-09-09
  • c++動態(tài)內(nèi)存空間示例(自定義空間類型大小和空間長度)

    c++動態(tài)內(nèi)存空間示例(自定義空間類型大小和空間長度)

    這篇文章主要介紹了c++動態(tài)內(nèi)存空間示例,自定義空間類型大小和空間長度,需要的朋友可以參考下
    2014-04-04
  • C++中的string類型

    C++中的string類型

    這篇文章主要介紹了C++中的string類型,在C++當(dāng)中,除了char 類型,還有專門的字符串類型,就叫做string,下面文字將圍繞其相關(guān)資料展開詳細(xì)內(nèi)容,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • C++日期類(Date)實現(xiàn)的示例代碼

    C++日期類(Date)實現(xiàn)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C++語言實現(xiàn)日期類(Date),可以實現(xiàn)確定某年某月有多少天、打印日期等功能,感興趣的可以了解一下
    2022-07-07

最新評論