欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c++类模板之友元函数

程序员文章站 2022-03-30 21:57:57
前言:自从开始学模板了后,小编在练习的过程中。常常一编译之后出现几十个错误,而且还是那种看都看不懂那种(此刻只想一句MMP)。于是写了便写了类模板友元函数的用法这篇博客。来记录一下自己的学习。 普通友元函数的写法: 第一种:(直接上代码吧) 第二种方法: 运算符重载中的友元函数: 方法一: 方法二: ......

前言:自从开始学模板了后,小编在练习的过程中。常常一编译之后出现几十个错误,而且还是那种看都看不懂那种(此刻只想一句mmp)。于是写了便写了类模板友元函数的用法这篇博客。来记录一下自己的学习。

 

普通友元函数的写法:

第一种:(直接上代码吧)

#include <iostream>
#include <string>

using namespace std;

template<class t>
class person{
public:
    person(t n)
    {
        cout << "person" << endl;
        this->name = n;
    }
    ~person()
    {
        cout << "析构函数" << endl;
    }
    //友元函数
    /********************************/
    template<class t>
    friend void print(person<t> &p);
    /*******************************/
private:
    t name;
};

//友元函数
template<class t>
void print(person<t> &p)
{
    cout << p.name << endl;
}



int main()
{
    person<string>p("xiaoming");
    print(p);

    system("pause");
    return 0;
}

 第二种方法:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 //方法二必不可缺的一部分
 7 /**************************************/
 8 template<class t> class person;
 9 template<class t> void print(person<t> &p);
10 /****************************************/
11 template<class t>
12 class person{
13 public:
14     person(t n)
15     {
16         cout << "person" << endl;
17         this->name = n;
18     }
19     ~person()
20     {
21         cout << "析构函数" << endl;
22     }
23     //友元函数
24     /********************************/
25     friend void print<t>(person<t> &p);
26     /*******************************/
27 private:
28     t name;
29 };
30 
31 //友元函数
32 template<class t>
33 void print(person<t> &p)
34 {
35     cout << p.name << endl;
36 }
37 
38 
39 
40 int main()
41 {
42     person<string>p("xiaoming");
43     print(p);
44 
45     system("pause");
46     return 0;
47 }

运算符重载中的友元函数:

方法一:

#include <iostream>
#include <string>

using namespace std;


template<class t>
class person{
public:
    person(t n)
    {
        cout << "person" << endl;
        this->name = n;
    }
    ~person()
    {
        cout << "析构函数" << endl;
    }
    //友元函数
    /********************************/
    template<class t>
    friend ostream& operator<<(ostream &os, person<t> &p);
    /*******************************/
private:
    t name;
};

//运算符重载
template<class t>
ostream& operator<<(ostream &os, person<t> &p)
{
    os << p.name << endl;
    return os;
}


int main()
{
    person<string>p("xiaoming");
    cout << p << endl;
    system("pause");
    return 0;
}

方法二:

#include <iostream>
#include <string>

using namespace std;


template<class t>
class person{
public:
    person(t n)
    {
        cout << "person" << endl;
        this->name = n;
    }
    ~person()
    {
        cout << "析构函数" << endl;
    }
    //友元函数
    /********************************/
    //template<class t>
    friend ostream& operator<<<t>(ostream &os, person<t> &p);
    /*******************************/
private:
    t name;
};

//运算符重载
template<class t>
ostream& operator<<(ostream &os, person<t> &p)
{
    os << p.name << endl;
    return os;
}


int main()
{
    person<string>p("xiaoming");
    cout << p << endl;
    system("pause");
    return 0;
}