C++中template的使用以及常见问题

原文:https://www.cnblogs.com/jiading/p/9838024.html

  1. 模板的声明有两种:template <typename Type>或者template<class Type>。虽然建议使用typename以避免二义性,但是这两种实际上是都可以的。
  2. 模板只作用于其下方的一个类或者函数,所以在类外实现成员函数时要对每一个函数都在之前进行模板的声明(即使如果这个函数没有用到这个模板类型,但是类名里也要加上<Type>)
  3. 与普通函数和类不同,模板函数或类在其他类作为友元之前必须先进行声明(不用定义,声明即可),否则无法通过编译,例如:
    template<typename T>class BinaryTree;
    template<typename T>
    class BinaryTreeNode {//define the node of binary tree
        friend class BinaryTree<T>;
        //friend class BinarySearchTree<T>;

    如果不加入第一行,则无法通过编译。

  4. 在同一个类或者函数中可以使用多个模板,放在一条语句中声明即可:template<typename T1,T2>。
  5. 模板类和函数在实例化时。注意不能使用new语句,而应采用 类名<具体类型名>具体类或者函数的名称。这一点在初学时很容易犯。
  6. 在同一个文件的不同类中可以使用多个模板,例如对class a,我们使用了模板T1,对于class B,我们可以使用模板T2,完全没有问题。不仅如此,在实例化时,可以把一个类的模板类型实例化为另一个模板类或者与其有关的类型。例如,定义链队列类时:
    template <typename Type>
    class LinkQueueNode {

        定义二叉树类时:

    template<typename T>
    class BinaryTree {

       而在二叉树的一个成员函数中,我们可以使用:

    void BinaryTree<T>::LevelOrder(BinaryTreeNode<T>*root)
    {
        /*二叉树的层序遍历*/
        LinkQueue<BinaryTreeNode<T>*>tQueue;//链队列,节点类型为二叉树节点指针类型

          注意这里把链队列的类型实例化为了二叉树节点类指针的类型!这样,在最后将二叉树类型实例化时,使用链队列对象就完全没有问题。

  7. 对于使用了模板的类要注意,定义成员函数时,类型名之后都要加<T>,其他和普通成员函数的定义完全一样,尤其在类外定义时不要出错。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些常见的C++开发面试问题及其答案: 1. 什么是C++?它有什么优点和缺点? C++是一种通用的编程语言,它继承了C语言的基本语法结构,并增加了许多新的特性和功能。它的优点包括高效性、跨平台性、面向对象编程和泛型编程等。而缺点包括较高的学习曲线、易于出现内存泄漏和指针错误等。 2. 什么是指针?如何使用指针? 指针是一个变量,它存储了一个内存地址。使用指针可以直接操作内存的数据,而不需要通过变量名来引用。要使用指针,需要先声明一个指针变量,然后将其初始化为所需的地址,可以使用取地址符号&和解引用符号*来获取和操作指针。 3. 请解释下面的代码段: ``` int a = 10; int *p = &a; *p = 20; ``` 这段代码将a的值设置为10,然后创建一个指向a的指针p,并将p初始化为a的地址。然后,将p指向的值设置为20,也就是将a的值设置为20。 4. 什么是引用?与指针有什么区别? 引用是一个别名,它提供了一个已经存在的变量的另一个名称。与指针不同的是,引用不能被重新赋值为另一个地址,它一旦被初始化就一直指向同一个变量。引用通常用于函数参数传递和返回值。 5. 什么是面向对象编程?C++如何支持面向对象编程? 面向对象编程是一种编程范式,它将数据和操作数据的方法组合在一起,形成对象。C++通过类和对象来支持面向对象编程,类定义了对象的属性和方法,对象是类的一个实例。 6. 什么是构造函数和析构函数? 构造函数是一种特殊的函数,它在创建对象时被调用,用于初始化对象的数据成员。析构函数是一种特殊的函数,它在销毁对象时被调用,用于清理对象占用的资源。 7. 什么是虚函数?C++如何使用虚函数? 虚函数是一种特殊的函数,它可以被子类重写。C++使用virtual关键字来声明虚函数,并使用override关键字来标记子类的重写函数。 8. 什么是模板?如何使用模板? 模板是一种通用的编程技术,它允许程序员编写通用的代码,以便在不同的数据类型上使用C++使用template关键字来定义模板,可以使用模板参数来指定通用代码的数据类型。 9. 什么是异常?如何处理异常? 异常是程序的一种错误,它可能会导致程序崩溃或无法正常执行。C++使用try-catch语句来处理异常,try块包含可能引发异常的代码,catch块包含对异常的处理代码。 10. 什么是STL?它包含哪些组件? STL是标准模板库的缩写,它是C++的一个库,提供了许多常用的数据结构和算法。STL包含容器、迭代器、算法和函数对象等组件。常用的容器包括vector、list、map和set等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值