类模板的成员函数被认为是函数模板,也称为类属函数。因此,当给出一个类模板的成员函数的定义时,必须遵循函数模板的定义。在类模板中,可以用类型参数名表示数据成员的类型,也可以表示成员函数返回值、形参和局部变量的类型。类模板定义中的类型参数可带默认值。说明以下类模板的功能。......
2023-11-07
同样,类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。
声明类模板之后,创建模板类的一般格式如下:
类模板名<类型实参表>对象表;
其中,“类型实参表”应与该类模板中的“模板参数表”相匹配。“对象表”是定义该模板类的一个或多个对象。
如对前面说明的类模板TClass的实例化可以这样进行:
TClass<double,500>sc;
实例化中所用的实参必须和类模板中定义的形参具有同样的顺序和类型,如以下实例化会造成编译错误:
TClass<double,500U>sc;
这是因为,类模板中定义的表达式参数int exp1和类型(unsigned int)500U不匹配。
使用类模板实例化模板类时要注意一个事情,在类模板中进行的运算必须适合于实例化时指定的类型。例如,前面例5.7中TClass1类模板,可以实例化为TClass1<int>或TClass1<double>,但实例化为TClass1<char>时出错,因为在调用add成员函数时不能进行两个字符的相加运算。
【例5.8】分析以下程序的执行结果。
解:上述程序中声明了一个类模板Array<T>,其私有数据成员size是一个整数,代表动态数组的大小,还有一个指针,当实例化模板类时,它指向定义类型的数组对象,构造函数中使用类型参数T来分配数组对象的空间,它的大小在模板类定义中已经确定:
Array<char>ac(10);
这样,实例化类模板Array<T>的模板类Array<char>,并实例化该模板类的对象ac,从而为ac对象定义和分配了内存空间,然后调用两个类成员函数fill_array和disp_array。该程序中的类模板、模板类和对象之间的关系如图5.3所示。程序的一次执行如下:(www.chuimin.cn)
填充一个字符数组(输入5个数据)
第1个数据:a↙
第2个数据:b↙
第3个数据:c↙
第4个数据:d↙
第5个数据:e↙
数组的内容是:a b c d e
填充一个双精度数组(输入3个数据)
第1个数据:1.2↙
第2个数据:5.6↙
第3个数据:3.1↙
数组的内容是:1.2 5.6 3.1
图5.3 类模板、模板类和对象之间的关系
有关C++程序设计基础教程的文章
类模板的成员函数被认为是函数模板,也称为类属函数。因此,当给出一个类模板的成员函数的定义时,必须遵循函数模板的定义。在类模板中,可以用类型参数名表示数据成员的类型,也可以表示成员函数返回值、形参和局部变量的类型。类模板定义中的类型参数可带默认值。说明以下类模板的功能。......
2023-11-07
声明函数模板的一般格式如下:template<模板参数表>函数返回值类型函数模板名(形参表)函数模板定义由关键字template开头,表示声明一个模板。模板参数表写在尖括号<>中,参数一般由关键字class或typename后加一个标识符构成。Class和typename的意义相同,表示后面的标识符是一个参数类型,代表一个潜在的标准类型或用户定义的类型。例如,定义max函数模板求两个数中的较大者。如下面的声明是错误的:可以看出,用函数模板比函数重载更方便,程序更简洁。......
2023-11-07
本节采用类模板设计几个通用的数据结构,这种类属程序设计方法不仅提高了程序的可靠性,而且大大提高了程序设计效率。抽象数据类型线性表的定义如下:设计满足上述定义的List
2023-11-07
所以,在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含对子对象初始化的构造函数。最后执行派生类的构造函数。其中,如果派生类新增成员中有某个类的子对象,第步的调用才会执行,否则就直接跳转到第步,执行派生类的构造函数。在某些情况下,派生类构造函数的函数体可能为空,仅起到参数传递作用。......
2023-11-07
类是一种用户自定义的数据类型,定义一个类,就是描述类名及其成员。“类名”是一个标识符,用于唯一标识一个类。分析以下声明MyClass类的组成。该类的描述如图2.1所示,其中大圆圈中列出的函数名均为公有函数名,小圆圈中列出的是所有数据成员。图2.1MyClass类描述注意:因为类是一种数据类型,在声明一个类时系统并不会为其分配内存空间,所以在定义类中的数据成员时,不能对其进行初始化。......
2023-11-07
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数。只能通过构造函数的参数初始化表对常数据成员进行初始化。这样,在执行构造函数时自动将“常数据成员1”赋值为“参数1”的值,“常数据成员2”赋值为“参数2”的值,…......
2023-11-07
派生类的对象不仅存放了在派生类中定义的非静态数据成员,而且也存放了从基类中继承下来的所有非静态数据成员,因而在派生类中存放的这些从基类继承下来的数据存储又称派生类对象的子对象。图6.8对象a和b的存储空间分配与非静态数据成员存储方式不同,基类与派生类的静态数据成员与成员函数是共享的。当派生类B对象使用从基类A继承下来的setvaluea和dispa成员函数时,编译系统会自动将这一调用映射到基类存放的代码。......
2023-11-07
相关推荐