有关于友元类,函数模板等

来源:互联网 发布:ubuntu 手机助手 编辑:程序博客网 时间:2024/06/06 09:28

一,友元类

1.一份简单的代码:

#include <iostream>

class c3{
    public:
        friend class c1;
        c3(int i):private_num(i){}
        int get_private_num(){return private_num;}
    private:
        int private_num;
};
class c1{
    public:
        c1(int i):number(i){}
        c1(){}
        int get_number(){ return number;}
        int get_c3_num(class c3 i){ return i.private_num;}
    private:
        int number;
};
class c2:public c1{
    public:
        c2(){}
        int get_c3_number(class c3 i){ return c1::get_c3_num(i);}
};


int main ()
{
   class c3 t3(3);
   std::cout << "in class c3 " << t3.get_private_num() << std::endl;
   class c1 t1(1);
   std::cout << "in class c1 " << t1.get_number() << std::endl;
   std::cout << "in class c1 " << t1.get_c3_num(t3) << std::endl;
   class c2 t2;
   std::cout << "in class c2 " << t2.get_c3_number(t3) << std::endl;
   return 0;


}

2.运行结果:

in class c3 3
in class c1 1
in class c1 3
in class c2 3

3.一点理解:

友元可以访问类的private和protected数据;

友元关系不能继承;

如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予;

二,函数模板

1.一份简单的代码

#include <string>
#include <iostream>
#include <typeinfo>
template <typename T>
int compare(const T &a,const T &b)
{
    std::cout << typeid(a).name() << ","<< a << "," << b << std::endl;
    if(a > b) return 1;
    if(a < b) return -1;
    return 0;
}
int main(int argc,char* argv[])
{
    int iret;
    std::string a = "1231";
    std::string b = "234";
    iret = compare(a,b);
    std::cout << iret << std::endl;
    iret = compare(2,1);
    std::cout << iret << std::endl;
    iret = compare(2.1,2.1);
    std::cout << iret << std::endl;
    return 0;
}

2.运行结果:

Ss,1231,234
-1
i,2,1
1
d,2.1,2.1
0

3.一点理解:

函数模板是一个独立于类型的函数,可作为一种方式,产生函数的特定类型的版本;

模板定义以关键字template开始,后接模板形参表,形参表不能为空;

类型形参跟在关键字class或typename之后定义,在这里class和typename没有区别;

模板形参作用域:模板形参的名字可以在声明为模板形参之后直到模板声明或定义的末尾处使用;