学习目标:
*掌握类模版配合友元函数的类内和类外实现
全局函数类内实现-直接在类内声明友元即可
全局函数类外实现-需要提前让编译器知道全局函数的存在
//通过全局函数,打印person信息
template<class T1, class T2>
class Person;
//类外实现
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
{
//全局函数 类内实现
friend void printPerson(Person<T1, T2>p)
{
cout << "姓名: " << p.m_Name << "年龄: " << p.m_Age << endl;
}
/*全局函数 类内实现*/
//加空模版参数列表
//如果全局函数是类外实现,需要让编译器提前知道这个函数的存在
friend void printPerson2<>(Person<T1, T2>p);//没加<>的话这就是一个普通函数的声明
/*让编译器提前知道的原因:如果你在类中声明了一个友元函数,而这个友元函数的实现在类的外部,
那么在类的定义之前,编译器并不知道这个函数的具体实现。为了解决这个问题,我们需要提前告
诉编译器这个函数的声明,让它知道函数的存在,以便在后续的编译和链接阶段能够正确处理。*/
public:
Person(T1 name, T2 age);
void showPerson()
{
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 test01()
{
Person<string, int>p("Jerry", 20);
printPerson2(p);
}
总结:建议全局函数做类内实现,用法简单,而且编译器可以直接识别
仅个人看视频笔记与理解,如有误可指出谢谢