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 @ 2021-04-18 14:16  yub4by  阅读(55)  评论(0)    收藏  举报