14.2.8重学C++之【类模板与友元】

#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;


/*
    1.3.8类模板与友元
        掌握类模板配合友元函数的类内和类外实现
        全局函数类内实现 - 直接在类内声明友元即可
        全局函数类外实现 - 需要提前让编译器知道全局函数的存在
*/


//提前让编译器知道Person类的存在
template<class T1, class T2>
class Person;


// 全局函数 类外实现
template<class T1, class T2>
void show2(Person<T1, T2> p)
{
    cout << "name:" << p.name << " age:" << p.age << endl;
}


template<class T1, class T2>
class Person{

    // 全局函数 类内实现
    friend void show(Person<T1, T2> p)
    {
        cout << "name:" << p.name << " age:" << p.age << endl;
    }

    friend void show2<>(Person<T1, T2> p); // 全局函数 类内声明
    //加上空模板参数列表,以表示该函数声明是类模板中的一个函数模板的声明,而不是普通函数声明
    //如果全局函数是类外实现,需要让编译器提前知道该函数的存在

public:
    Person(T1 _name, T2 _age)
    {
        this->name = _name;
        this->age = _age;
    }

private:
    T1 name;
    T2 age;

};


void test(){
    Person<string, int> p("tom", 10);
    show(p);
    show2(p);
    //建议采用全局函数做类内实现,用法简单,而且编译器可以直接识别
}


int main(){
    test();

    system("pause");
    return 0;
}

posted @   yub4by  阅读(49)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示