学习目标:

  • 掌握类模板配合友元函数的类内和类外实现

全局函数类内实现 - 直接在类内声明友元即可

全局函数类外实现 - 需要提前让编译器知道全局函数的存在

1、全局函数类内实现 - 直接在类内声明友元即可

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



template<class T1,class T2>
class Person
{
	//1、全局函数配合友元 类内实现
	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;

};

//1.全局函数再类内实现
void test01() {
	Person<string, int>p("Tom", 20);
	printPerson(p);

}



int main() {

	test01();
	system("pause");
	return 0;
}

2、全局函数类外实现 - 需要提前让编译器知道全局函数的存在

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

//2、全局函数配合友元  类外实现 - 先做函数模板声明,提前让编译器知道,下方在做函数模板定义,在做友元
template<class T1, class T2>
class Person;

//如果声明了函数模板,可以将实现写到后面,否则需要将实现体写到类的前面让编译器提前看到
//template<class T1, class T2> void printPerson2(Person<T1, T2> & p); 

//2.全局函数配合友元再类外实现
template<class T1, class T2>
 void printPerson2(Person<T1, T2>& p) {
	cout << "姓名: " << p.m_name << " 年龄:" << p.m_age << endl;
}



template<class T1,class T2>
class Person
{
	//1、全局函数配合友元 类内实现
	friend void printPerson(Person<T1, T2>& p) {
		cout << "姓名: " << p.m_name << " 年龄:" << p.m_age << endl;
	}


	//2、全局函数配合友元在类外实现
	 //注意这里需要添加一个空模板的参数列表
	//需要让编译器知道这个函数模板存在
	friend void printPerson2 <>(Person<T1, T2>& p);

public:
	Person(T1 name ,T2 age) {
		this->m_name = name;
		this->m_age = age;

	}

private:
	T1 m_name;
	T2 m_age;

};

//1.全局函数再类内实现
void test01() {
	Person<string, int>p("Tom", 20);
	printPerson(p);

}


//2.全局函数再类外实现
void test02() {
	Person<string, int>p("Jim", 20);
	printPerson2(p);

}



int main() {

	test02();
	system("pause");
	return 0;
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐