7.2 C++模板类实例化
参考:http://www.weixueyuan.net/view/6399.html
总结:
array < int >表明用int类型来代替模板类中的类参数“T”,编译器会将模板类array中所有的类参数T都用int来代替。
我们称array < int >和array < double >成为模板类的实例。
我们在例1中创建的对象A是属于模板类实例化后的类的,而不是属于模板类的。换言之模板类不进行实例化就不能创建对象。
另外模板类可以以参数的形式出现在函数的参数列表中,如果参数列表中有模板类,则函数前面必须加上模板头,在例1中的模板头为“template< class T >”。
我们可以通过“< >”指定一种数据类型,从而创建出一个模板类的实例。有了前面定义的模板类,如果我们想创建一个int数组可以按照如下方式使用模板类:
array < int > a();
array < int >表明用int类型来代替模板类中的类参数“T”,编译器会将模板类array中所有的类参数T都用int来代替。例如类中的私有成员变量“T * num;”会被替换为“int * num;”。对类中的成员函数也会进行相同的替换,如“T & operator[]( int );”将会被替换为“int & operator[]( int );”。
如果我们定义对象:
array < double > D();
则模板类中所有的类参数“T”都将被换为double。我们称array < int >和array < double >成为模板类的实例。使用这些实例就与使用普通类是一样的。
例1:
#include <iostream>
using namespace std; template< class T >
class array
{
public:
array( int );
T & operator[]( int );
const T & operator[] ( int )const;
int getlen() const { return length; }
~array();
private:
array(){};
int length;
T * num;
}; template < class T >
array< T >::array( int n )
{
num = new T[n];
length = n;
} template < class T >
array< T >::~array()
{
delete[] num;
} template< class T >
T & array< T > ::operator[] ( int i )
{
if( i < || i >= length )
throw string( "out of bounds" );
return num[i];
} template< class T >
const T & array< T > ::operator[] (int i) const
{
if( i < || i >= length)
throw string( "out of bounds" );
return num[i];
} template< class T >
ostream & operator<<( ostream & out, const array <T> & A )
{
for(int i=; i < A.getlen(); i++)
out<< A[i] << " ";
return out;
} int main()
{
array< int > A();
for(int i = ; i < ; i++)
{
A[i] = *i;
}
cout<<A<<endl;
return ;
}
本例是一个完整的模板类示例,在该例中我们定义了一个array模板类,在主函数中我们对其进行了实例化,“array< int > A(10);”实例化之后创建了一个对象A,该对象是一个包含10个元素的整型数组。之后用一个for循环给数组赋初值,由于我们重载了下标操作符,因此可以凭借下标直接访问相应的数组元素。之后直接输出A数组的所有元素,此时调用的是输出操作符重载函数。
我们在例1中创建的对象A是属于模板类实例化后的类的,而不是属于模板类的。换言之模板类不进行实例化就不能创建对象。
例2:
Arrar A();
Array< T > A();
Template< class T > Array <T> A();
在本例中,三种定义对象的方式都是无效的,模板类不进行实例化是无法创建对象的。
另外模板类可以以参数的形式出现在函数的参数列表中,例如例1中的输出操作符重载函数“template< class T > ostream & operator<<(ostream & out, const array <T> & A)”,该函数的第二参数是array <T>的引用,如果参数列表中有模板类,则函数前面必须加上模板头,在例1中的模板头为“template< class T >”。
7.2 C++模板类实例化的更多相关文章
- 20140315 模板类pair的用法 2、visual 2010调整代码格式是ctrl+k+
1.模板类pair的用法 包含头文件#include<utility> http://blog.csdn.net/laixingjun/article/details/9005200 ...
- [百度空间] [原]DLL导出实例化的模板类
因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.但是 ...
- 模板类 error LNK2019: 无法解析的外部符号
如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...
- c++模板类
c++模板类 理解编译器的编译模板过程 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”.看看我们几乎每天都能遇到的模板类吧,如S ...
- C++ 模板函数与模板类
一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板:
- C++模板类的使用
1.定义模板类 通过类似于下面的语法可以定义一个模板类: template<typename T> class Job : public virtual RefBase { public: ...
- C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
1. 主版本模板类 首先我们来看一段初学者都能看懂,应用了模板的程序: 1 #include <iostream> 2 using namespace std; 3 4 template ...
- C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? 这个feature叫做Export Template,即外名模板,它的作用在于使得模板代码可依照C/C++语言习惯,将模板声明和实现 ...
- C++学习34 模板类
C++除了支持模板函数,还支持模板类.模板类的目的同样是将数据类型参数化. 声明模板类的语法为: template<typename 数据类型参数 , typename 数据类型参数 , …&g ...
随机推荐
- Top 命令解析
TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中C ...
- linux: 安装jdk(java)
作为Java开发人员,在Linux下安装一些开发工具是必备技能,本文以安装jdk为例,详细记录了每一步的操作命令,以供参考. 0.下载jdk8 登录网址:http://www.oracle.com/t ...
- 【转】 C语言文件操作详解
转自:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供 ...
- codeforces590b//Chip 'n Dale Rescue Rangers//Codeforces Round #327 (Div. 1)
题意:从一点到另一点,前t秒的风向与t秒后风向不同,问到另一点的最短时间 挺难的,做不出来,又参考了别人的代码.先得到终点指向起点的向量,设T秒钟能到.如果T>t则受风1作用t秒,风2作用T-t ...
- css对于文字过长加省略号
overflow: hiddentext-overflow: ellipsiswhite-space: nowrap
- Canvas画板
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA6QAAAGgCAIAAAAy0z21AAAgAElEQVR4nO3dfYwkZ30n8JqZfcNex8
- Java编码 蛇形矩阵的构建与遍历输出
一.蛇形矩阵的构建,并按行输出 例: 输入:n, 生成n*n的蛇形矩阵 1 2 3 8 9 4 7 6 5 输出:1 2 3 8 9 4 7 6 5 java编码 public static void ...
- sqlite3 查询表
cx = sqlite3.connect("c:/数据库地址") # 打开数据库cu = cx.cursor()# query the tablerows = cu.execute ...
- AWR报告学习示例
1. 参数1 AAS AAS讲解 elapsed 为 该AWR性能报告的时间跨度 DB_TIME =所有前台session花费在database调用上的总和时间. 注意:前台进程 foregrou ...
- Mybatis中,当插入数据后,返回最新主键id的几种方法,及具体用法
insert元素 属性详解 其属性如下: parameterType ,入参的全限定类名或类型别名 keyColumn ,设置数据表自动生成的主键名.对特定数据库(如PostgreSQL),若自动生成 ...