zoukankan      html  css  js  c++  java
  • 类模板语法知识注意事项

    一、所有的类模板函数写在类的内部和写在类的外部,在一个cpp中

    1.构造函数,没有问题;

    2.普通函数,没有问题;

    3.友元函数:用友元函数重载 << >>

         friend ostream& operator<< <T> (ostream &out, Complex<T> &c3) ;

     友元函数:友元函数不是实现函数重载(非 << >>)

                  1)需要在类前增加 类的前置声明 函数的前置声明

                          template<typename T>

          class Complex; 

          template<typename T>

          Complex<T> mySub(Complex<T> &c1, Complex<T> &c2);

                   2)类的内部声明 必须写成:

          friend Complex<T> mySub <T> (Complex<T> &c1, Complex<T> &c2);

                   3)友元函数实现 必须写成:

                           template<typename T>

                   Complex<T> mySub(Complex<T> &c1, Complex<T> &c2)

          {

                   Complex<T> tmp(c1.a - c2.a, c1.b-c2.b);

                        return tmp;

          }

                 4)友元函数调用 必须写成

                                Complex<int> c4 = mySub<int>(c1, c2);

                     cout<<c4;

    结论:友元函数只用来进行左移、右移操作符重载。

     

    二、所有的类模板函数写在类的外部,在不同的.h和.cpp中,

    也就是类模板函数说明和类模板实现分开

    类模板函数

      构造函数

      普通成员函数

      友元函数

        用友元函数重载<<>>;

        用友元函数重载非<< >>

                       要包含.cpp

    总结:

    归纳以上的介绍,可以这样声明和使用类模板:

    1) 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。

    2) 将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如上例中的numtype)。

    3) 在类声明前面加入一行,格式为:

        template <class 虚拟类型参数>

    如:

        template <class numtype> //注意本行末尾无分号

        class Compare

        {…}; //类体

    4) 用类模板定义对象时用以下形式:

        类模板名<实际类型名> 对象名;

        类模板名<实际类型名> 对象名(实参表列);

    如:

        Compare<int> cmp;

        Compare<int> cmp(3,7);

    5) 如果在类模板外定义成员函数,应写成类模板形式:

       template <class 虚拟类型参数>

       函数类型 类模板名<虚拟类型参数>::成员函数名(函数形参表列) {…}

    关于类模板的几点说明:

    1) 类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如:

        template <class T1,class T2>

        class someclass

        {…};

    在定义对象时分别代入实际的类型名,如:

        someclass<int,double> obj;

    2) 和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对象。

    3) 模板可以有层次,一个类模板可以作为基类,派生出派生模板类。

  • 相关阅读:
    Eclipse_debug异常_Source not found
    Mybatis异常_01_Invalid bound statement (not found)
    [转]Eclipse快捷键_01_常用快捷键汇总
    PL/SQL学习笔记_03_存储函数与存储过程
    PL/SQL学习笔记_02_游标
    PL/SQL学习笔记_01_基础:变量、流程控制
    Oracle学习笔记_05_分组函数
    博客园_01_为博客园添加目录的方法总结
    Oracle学习笔记_04_多表查询
    Oracle学习笔记_03_单行函数
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/9750240.html
Copyright © 2011-2022 走看看