zoukankan      html  css  js  c++  java
  • C++知识点案例 笔记-6

    1.三种友元函数
    -非模板友元函数
    -约束模板友元函数
    -非约束模板友元函数
    2.非类型参数
    3.模板特化

    1.三种友元函数

    =====三种友元函数=====
    --1---非模板友元函数
    #include<iostream>
    using namespace std;
    template<typename T>
    class R
    {
        T lin_number;
        static int count;
    public:
        R(const T& t) :lin_number(t){ count++; }
        ~R(){count--;}
        friend void fun();//友元函数1
        friend void show(const R<T>& a);//友元函数2
    };
    template<typename T>
    //初始化count
    int R<T>::count = 0;
    //定义函数
    void fun()
    {
      cout<< "int_count:" << R<int>::count << endl;
      cout<< "double_count:" << R<double>::count <<endl;
    }
    
    void show(const R<int>& a)
    {
        cout<< "int_lin:" << a.lin_number <<endl;
    }
    void show(const R<double>& a)
    {
        cout<< "double_lin:" <<a.lin_number <<endl;
    
    }
    
    
    int main()
    {
        //调用函数1
        fun();
        //创建函数对象
        R<int> a(20);
        fun();
        R<double> b(50.2020);
        fun();
    
        show(a);
        show(b);
    
        return 0;
    
    
    
    }
    
    ---2--约束模板友元函数
    #include<iostream>
    using namespace std;
    //函数模板声名
    template<typename T>
    void fun();
    template<typename T>
    void show(T& a);
    //类模板定义
    template<typename U>
    class R
    {
        U lin_number;
        static int count;
    public:
        R(const U& u) :lin_number(u){ count++; }
        ~R(){count--;}
        friend void fun<U>();//友元函数1
        friend void show<>(R<U>& a);//友元函数2
    };
    template<typename T>
    int R<T>::count = 0;//初始化count
    template<typename T>
    void fun()
    {
        cout<< "tl_size:" << sizeof(R<T>) <<endl;
        cout<< "tl_count:"  << R<T>::count  <<endl;
    }
    
    template<typename T>
    void show(T& t)
    {
        cout<< "TL-lin_number:" << t.lin_number <<endl;
    }
    int main()
    {
        //调用int类型函数模板实例
        fun<int>();
        //创建函数对象  class R中对函数进行了限制(限制为U型)个人感觉约束之意就在此呀
        R<int>a(10);
        R<int>b(20);
        R<double>c(5.2);
        //调用show()输出类的数据成员信息
        show(a);
        show(b);
        show(c);
    
        fun<int>();
        fun<double>();
    
        return 0;
    
    }
    
    --3---非约束模板友元函数
    
    #include<iostream>
    using namespace std;
    template<typename T>
    class F
    {
    private:
    
        T lin_number;
    
    public:
        F(const T& t):lin_number(t){};
    
        //类内部声名函数模板
        template<typename U,typename V>
        friend void show(U& u,V& v);
    
    
    
    };
    template<typename U,typename V>
    void show(U& u,V& v)
    {
        cout<< u.lin_number<< "==AND=="<< v.lin_number<<endl;
    }
    
    int main()
    {
    
        F<int>a(10);
        F<int>b(20);
        F<double>c(5.2);
    
        show(a,b);
        show(a,c);
    
    
        return 0;
    
    }
    

    2.非类型参数

    ==非类型参数==
    #include<iostream>
    using namespace std;
    template<typename T,unsigned size>
    class Array
    {
    
    T arr[size];
    public:
        T& operator[] (unsigned i)       //运算符重载
        {
            if (i >= size)
                cout<<"Out of the bound !" <<endl;
            else
            return arr[i];
    
        }
    };
    
    int main()
    {
    
        Array<char,6>arr01;//定义长度为6的char类型数组
        Array<int,10>arr02;//定义长度为10的int类型数组
    
        arr01[0] = 'A';
        cout<< arr01[0] <<endl;                                 //如果此处输入的 下标 > = 6 则输出 Out of the bound !
    
        for(int j = 0;j < 10;j++)
        {
            arr02[j] = j;
        }
        for(int k = 0;k < 10;k++)
        {
            cout<< arr02[k] <<"_";
        }
    
    
        return 0;
    
    }
    
    

    3.模板特化

    ==模板特化==
    
    #include<iostream>
    #include<cstring>
    using namespace std;
    template<typename T>
    //定义函数模板
    bool is_equal(T m,T n)
    {
        return m == n;
    }
    //函数模板的特化
    template<>
    bool is_equal(char* t1,char* t2)
    {
        return strcmp(t1 , t2) == 0;
    }
    //类模板
    template<typename T>
    class Compare
    {
    public:
        bool is_equal(T m,T n)
        {
            return m == n;
        }
    
    };
    //类模板的特化
    template<>
    class Compare<char*>
    {
    public:
        bool is_equal(char* t1,char* t2)
        {
            return strcmp(t1 , t2) == 0;
        }
    
    
    };
    
    int main()
    {
    
        char str1 = 'jjf';
        char str2 = 'zl';
    
        cout<< "函数模板=AND=函数模板特化:" <<endl;
    
        cout<< is_equal(1,3) <<endl;
        cout<< is_equal(str1,str2) <<endl;
    
        cout<< "类模板=AND=类模板特化:" <<endl;
        Compare<int> c1;
        Compare<char> c2;
        cout<< c1.is_equal(1,1)<<endl;
        cout<< c2.is_equal(str1,str2)<<endl;
    
        return 0;
    
    }
    
    
  • 相关阅读:
    【LeetCode】589.N叉树的前序遍历(递归+迭代,java实现,详细分析)
    百度网盘偷偷更新,终于实现免费不限速了!
    如何调整DOS窗口的宽高
    输入adb shell 时 提示error: more than one device and emulator
    logcat不显示信息
    安卓打开File Explorer里面不显示内容
    android查看源码的时候看不了
    This version of the rendering library is more recent than your version of ADT plug-in. Please update
    eclipse或者AS链接手机真机之后,logcat里面日志信息乱跳
    Android ADB使用之详细篇
  • 原文地址:https://www.cnblogs.com/hugboy/p/12906637.html
Copyright © 2011-2022 走看看