c++类模板与友元

类模板与友元

学习目标:

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

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

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

示例:

复制代码
 
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 全局函数在类外实现

复制代码
#pragma region  全局函数配合友元  类外实现 -方式一 先做函数模板声明,下方在做函数模板定义,在做友元
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;
}
#pragma endregion
  
#pragma region  方式2 如果声明了函数模板,可以将实现写到后面,否则需要将实现体写到类的前面让编译器提前看到  比如方式1
 
//template<class T1, class T2> void printPerson2(Person<T1, T2> & p); 


#pragma endregion


 

template<class T1, class T2>
class Person
{ 
    //全局函数配合友元  类外实现   这里需要加<>这个
    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;

}; 

//2、全局函数在类外实现
void test02()
{
    Person <string, int >p("Jerry", 30);
    printPerson2(p);
}

int main() {
     

    test02();

    system("pause");

    return 0;
}
复制代码

 

 

总结:建议全局函数做类内实现,用法简单,而且编译器可以直接识别

 

posted @   安静点--  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示