设为首页 加入收藏

TOP

C++函数模板和类模板(二)
2023-07-23 13:27:35 】 浏览:58
Tags:
<o1.Sum()<<endl;//显示:16 return 0; }
#include<iostream>
using namespace std;
template <typename T> //类模板A
class A  //类声明部分
{
    private: //声明两个私有数据成员
        T a1;
        int a2;
    public:
        A(T p1,int p2); //定义构造函数
        void Show(); //显示数据成员
        T Sum(); //求数据成员的和
};
//类实现部分
template <typename T>
A <T>::A(T p1,int p2) 
{ a1 = p1; a2 = p2}
template <typename T>
void A <T>::Show() 
{ cout << a1 <<","<<a2 <<endl;}
template <typename T>
T A <T>::Sum()
{return (T)(a1+a2); }
int main()
{
    //用类模板定义对象
    A <double> o1(10.5,6); //double型对象
    o1.Show(); //显示:10.5,6
    cout<<o1.Sum()<<endl;//显示:16.5
    
    A <int> o2(10,6); //int型对象
    o2.Show(); //显示:10,6
    cout<<o1.Sum()<<endl;//显示:16
    return 0;
}

2、类模板的编译原理

??当定义到类模板定义对象语句时,编译器将根据所给出的实际数据类型来取代类型参数T。例如 A <double> o1(10.5,6);  编译时将类模板中类类型参数绑定到某个具体数据类型的过程,称为类模板的实例化。实例化所生成的类称为类模板的实例类。实例类是一个普通的类,可以用来定义对象。

??类模板编译原理:类模板是具有类型参数的类。类型参数是表示数据类型的参数,可指代任意实际数据类型。编译器在编译到使用类模板定义对象语句时,将首先按照所给定的实际数据类型对类模板进行实例化,生成一个实例类。最终,编译器使用实例类来定义所需要的对象。

3、类模板的继承和派生

??类模板可以被继承,派生出新类。以类模板为基类定义派生类,可以在派生时实例化,也可以继续定义派生类模板。

1、定义实例化派生类

??定义实例化派生类就是在派生类继承基类的时候将类型参数赋值,此时派生类对基类进行实例化。

实例化派生类示例
#include<iostream>
using namespace std;
template <typename T> //类模板基类Base
class Base  //类声明部分
{
    private: //声明私有数据成员
        T a;
    public:
        Base(T x) { a=x; }
        void Show() { cout<< "a="<<a<<","; }
};
//无类实现部分

class Derived:public Base<double> //公有继承基类模板Base,派生时实例化
{
    private: //声明新增数据成员
        int b;
    public:
        //注意派生类构造函数写法
        Derived(double p1,int p2):Base<double>(p1) { b=p2; } 
        //新增函数成员Show
        void Show() { Base <double>::Show(); cout<< "b="<<b<<endl; }
};

int main()
{
    Derived obj(10.5,6);//定义派生类Derived对象obj
    obj.Show(); //显示结果:a=10.5,b=6
    return 0;
}

??在编译到派生类Derived的定义代码时,编译器将按照所给定的实际数据类型double对类模板Base进行实例化,生成一个double型的实例类,最终派生类Derived继承的是该实例类。

2、定义派生类模板

??定义派生类模板是派生类在继承类模板基类时不进行实例化,因此派生类仍然是一个类模板。

派生类模板示例
#include<iostream>
using namespace std;
template <typename T> //类模板基类Base
class Base  //类声明部分
{
    private: //声明私有数据成员
        T a;
    public:
        Base(T x) { a=x; }
        void Show() { cout<< "a="<<a<<","; }
};
//无类实现部分

//公有继承类模板Base,派生类仍为类模板
template <typename T,typename TT> //新增类型参数TT
class Derived:public Base<T> //公有继承基类模板Base,定义派生类模板
{
    private: //声明新增数据成员
        TT b;
    public:
        //注意派生类构造函数写法
        Derived(T p1,TT p2):Base<T>(p1) { b=p2; } 
        //新增函数成员Show
        void Show() { Base <T>::Show(); cout<< "b="<<b<<endl; }
};

int main()
{
    Derived<double,int> obj(10.5,6);//定义派生类Derived对象obj
    obj.Show(); //显示结果:a=10.5,b=6
    return 0;
}

??和其他类模板一样,派生类模板Derived在定义对象时需要明确给出派生类模板中类型参数所指代的实际数据类型。程序员编程时,在定义多个功能相同但处理数据类型不同的类时应考虑是否可以将它们合并成一个类模板,这样可以凝练代码。再定义单个类时也可以考虑升级成类模板,这样可以提高函数代码的可重用性。对于调用类模板的程序员而言,类模板和普通类没有什么区别。只是在使用类模板时需要给出类型参数所指代的实际数据类型。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇聊聊 C++ 右值引用 和 移动构造函.. 下一篇Codeforces CodeTON Round 2 (Div..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目