C++ 模板进阶

题目

  1. 下列的模板声明中,其中几个是正确的( )

A.3

B.4

C.5

D.6

1)template

2)template<T1,T2>

3)template<class T1,T2>

4)template<class T1,class T2>

5)template<typename T1,T2>

6)template<typename T1,typename T2>

7)template<class T1,typename T2>

8)<typename T1,class T2>

9)template<typename T1, typename T2, size_t N>

10)template<typename T, size_t N=100, class _A=alloc<T>>

11)template<size_t N>
  • D

正确的定义为:4 6 7 9 10 11,一共6个

  1. 以下程序运行结果正确的是( )

A.This is Max This is Max This is Max This is Max

B.This is Max This is Max This is Max This is Max

C.This is Max This is Max This is Max This is Max

D.This is Max This is Max This is Max This is Max

template<typename Type>
Type Max(const Type &a, const Type &b)
{
	cout<<"This is Max<Type>"<<endl;
	return a > b ? a : b;
}
  
template<>
int Max<int>(const int &a, const int &b)
{
	cout<<"This is Max<int>"<<endl;
	return a > b ? a : b;
}

template<>
char Max<char>(const char &a, const char &b)
{
	cout<<"This is Max<char>"<<endl;
	return a > b ? a : b;
}
int Max(const int &a, const int &b)
{
	cout<<"This is Max"<<endl;
	return a > b ? a : b;
} 

int main()
{
	Max(10,20);
	Max(12.34,23.45);
	Max('A','B');
	Max<int>(20,30);
  
	return 0;
}
  • A

Max(10,20); //能够直接匹配int参数,调动非模板函数

Max(12.34,23.45); //double类型参数没有最佳匹配函数,此时只能调动模板函数

Max('A','B'); //能够直接匹配char参数,调动非模板函数

Max(20,30); //由于直接实例化了函数,因此要调动模板函数,但是,由于进行函数的int特化,所以会调动特化版本的模板函数

  1. 关于模板的编译说法错误的是( )

A.模板在.h文件中声明,在.cpp里面实现

B.模板程序一般直接在一个文件里面进行定义与实现

C.不久的将来,编译器有望支持export关键字,实现模板分离编译

D.模板不能分离编译,是因为模板程序在编译过程中需要经过两次编译

  • A
  1. 模板是编译期生成的代码结构

当你写一个模板类或函数时,编译器不会立即生成对应的机器码。

只有当模板被用到具体类型(如 MyTemplate)时,编译器才“实例化”生成实际代码。

  1. 实例化时机:在使用点

模板的代码生成是在使用它的地方进行的(即调用或创建对象时)。单纯的模板不知道实例化对象

因此,编译器必须在使用模板的地方能看到模板的完整定义,否则无法生成实例化代码。

  1. 分离编译与模板冲突

“分离编译”指的是将声明写在头文件(.h),实现写在源文件(.cpp)中。此时声明中有了模板,但是找这个函数位置的时候找不到,因为模板没有被实例化,所以定义必须和声明放在一起,main函数调用时将实例化类型赋给它,之后链接的时候就不用链接了,因为已经知道位置了,就是声明的地方。

对于模板来说,如果你把实现放在 .cpp 文件中,其他 .cpp 文件中包含头文件时是看不到模板定义的,编译器无法实例化模板。

学习笔记&amp;练习 文章被收录于专栏

学习过程中的一些记录

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务