c++從入門到精通——類模板之友元函數「類內實現」與「類外實現」

類內實現

函數printPerson雖然是放在類內,但它是一個全局函數。加上friend修飾,就可以訪問類內的私有屬性。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;

template<class T1 ,class T2>
class Person
{
	//友元函數類內實現
	friend void printPerson( Person<T1 ,T2> & p )
	{
		cout << "姓名:" << p.m_Name << "  年齡: " << p.m_Age << endl;
	}
public: 
	Person(T1 name, T2 age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

private:
	T1 m_Name;
	T2 m_Age;
};

void test01()
{
	Person<string, int> p("Tom", 10);
	printPerson(p);//全局函數
}


int main(){
	test01();


	system("pause");
	return EXIT_SUCCESS;
}

類外實現(比較難)

第一步,給普通函數加上<>變成模樣函數
在這裏插入圖片描述
第二步,讓編譯器看到Person類聲明,讓編譯器提前看到printPerson聲明
在這裏插入圖片描述
第三步,實現函數
在這裏插入圖片描述

完整代碼

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;

//讓編譯器提前看到printPerson聲明

//讓編譯器看到Person類聲明
template<class T1, class T2> class Person;
template<class T1, class T2>void printPerson(Person<T1, T2> & p);


template<class T1, class T2>
class Person
{
	//友元函數類內實現  利用空參數列表 告訴編譯器 模板函數的聲明
	friend void printPerson<>(Person<T1, T2> & p); //普通函數 聲明
	/*{
		cout << "姓名:" << p.m_Name << "  年齡: " << p.m_Age << endl;
	}*/
public:
	Person(T1 name, T2 age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

private:
	T1 m_Name;
	T2 m_Age;
};

//類外實現
template<class T1 ,class T2>
void printPerson(Person<T1, T2> & p)
{
	cout << "姓名:" << p.m_Name << "  年齡: " << p.m_Age << endl;
}

void test01()
{
	Person<string, int> p("Tom", 10);
	printPerson(p);
}


int main(){

	test01();

	system("pause");
	return EXIT_SUCCESS;
}

運行,得

姓名:Tom  年齡: 10
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章