成都网站建设设计

将想法与焦点和您一起共享

“模板类与友元”那些事(C++)-创新互联

  模版类就是类模版实例化之后的类,友元就是一种对函数访问权限的控制,通过将函数设为友元函数让其能够访问其他外部函数不能访问的"private"成员变量。

万州ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

      接着我们介绍一个他们结合在一起会产生什么样的结果,他们的结合分为三种情况:

        1、模板类的非模板友元函数

        该友元函数的特点是:

        A)当该友元函数不使用类模版中的成员变量时,与一般的友元函数没有区别:

        B)当该友元函数使用类模版中的成员变量时,必须为每一个基本类型定义一个友元函数,比如show 和 show.这两个并不是函数的重定义,属于函数重载。

  测试代码如下:

template
class Base{
public:
    Base(T x, T y): x(x), y(y){}
    friend void print();
    friend void show(Base &a);
private:
    T x;
    T y;
};
void show(Base &a)
{
    cout << "x = " << a.x << ", y = " << a.y << endl;
}
void show(Base &a)
{
     cout << "x = " << a.x << ", y = " << a.y << endl;
}
void print(){
    cout << "hello, world" << endl;
}
int main()
{
    Base ai(99, 999);
    Base ad(99.99, 200.88);
    print();
    show(ai);
    show(ad);
    return 0;
}

        2、模板类的约束友元函数

            该友元函数的特点是:每一个类的具体化与友元的具体化要匹配,也就是说,int类具体化获得一个int类的友元函数,double类就具体化会获得一个double函数,int类具体化不可能获得double类函数;

           要定义一个约束模板友元函数分三步:

        A)在定义类之前声明友元函数模板;

        B)在类中声明该友元函数模板;

        C)定义友元函数,

         注意,定义友元函数时形参列表中的”T“代表,具体化之后的类,并不是类的模板参数,也就是假如具体化一个模板类”A“, ”T“代表”A“, 并不是”int“;通过这种方式来约束该友元函数属于某个具体化之后的模板。

templatevoid print(); // 第一步:在类定义之前生命函数模板
templatevoid show(T &t);
 
template
class Base{
public:
    Base(T x, T y): x(x), y(y){}
    friend void print();  // 第二步:在类中声明友元函数模板
    friend void show<>(Base& a);
private:
    T x;
    T y;
};
//第三步:定义友元函数
void print()
{
    cout << "hello, friend function template" << endl;
}
template
void show(T &a)  // 这里的T代表一个具体化之后的类
{
    cout << "x = " << a.x << ", y = " << a.y << endl;
}
int main()
{
    Base a(99, 999);
    print();
    show(a);
    return 0;
}

        3、模板类的非约束友元函数

    该友元函数的特点与约束友元函数相反:也就是每个类的具体化都会获得每个函数的具体化,假如具体化一个int类,在该类中仍然可以获得一个double、string、int等类的友元函数。

template
class Base{
public:
    Base(T x, T y): x(x), y(y){}
    template
    friend void print(Base &obj);
private:
    T x;
    T y;
};
template
void print(Base &obj){
    cout << "x = " << obj.x << ", y = " << obj.y << endl;
}
int main()
{
    Base a(99, 999);
    print(a);
    return 0;
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前题目:“模板类与友元”那些事(C++)-创新互联
链接地址:http://chengdu.cdxwcx.cn/article/csodee.html