C++ 类模板与友元
1.全局函数类内实现: 直接在类内声明友元即可
类内void printPerson(Person<T1,T2> p) 添加 friend 为友元 为全局函数,非类内成员函数
1 #include <iostream> 2 using namespace std; 3 //通过全局函数 打印Person信息 4 template<class T1,class T2> 5 class Person 6 { 7 //全局函数类内实现 8 friend void printPerson(Person<T1, T2> p) 9 { 10 cout << "Name: " << p.m_Name << " Age:" << p.m_Age << endl; 11 } 12 public: 13 Person(T1 name, T2 age) 14 { 15 this->m_Name = name; 16 this->m_Age = age; 17 } 18 private: 19 T1 m_Name; 20 T2 m_Age; 21 }; 22 void test()//全局函数类内实现 23 { 24 Person<string, int>p("Tom", 11); 25 printPerson(p); 26 } 27 int main() 28 { 29 test(); 30 system("pause"); 31 return 0; 32 }
2.全局函数类外实现:需要提前让编译器知道全局函数的存在
1 #include <iostream> 2 using namespace std; 3 //通过全局函数 打印Person信息 4 //提前让编译器知道Person类的存在 5 template<class T1,class T2> 6 class Person; 7 //类外实现-- 8 template<class T1, class T2> 9 void printPerson2(Person<T1, T2> p) 10 { 11 cout << "类外实现--姓名" << p.m_Name << "\n类外实现--年龄" << p.m_Age << endl; 12 } 13 template<class T1,class T2> 14 class Person 15 { 16 //全局函数类外实现 17 //加一个空模板的参数列表 18 //如果全局函数是类外实现 需要让编译器提前知道这个函数的存在 19 friend void printPerson2<>(Person<T1, T2> p); 20 public: 21 Person(T1 name, T2 age) 22 { 23 this->m_Name = name; 24 this->m_Age = age; 25 } 26 private: 27 T1 m_Name; 28 T2 m_Age; 29 }; 30 31 void test2()//全局函数类外实现 32 { 33 Person<string, int>p("Ge", 22); 34 printPerson2(p); 35 } 36 int main() 37 { 38 test2(); 39 system("pause"); 40 return 0; 41 }
总结:全局函数尽量做类内实现,用法简单,而且编译器可以直接识别
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)