当前位置: 首页 > news >正文

【类模板】类模板的基本范式

一、类模板的概念

类模板与一般的模板一样,都是通过给定的模板参数,生成具体的类,也就是实例化一个特定的类。这个概念和函数模板差不多。
例如,在 C + + C++ C++中的 s t d : : v e c t o r std::vector std::vector容器就是一个经典的类模板,如 s t d : : v e c t o r < i n t > std::vector<int> std::vector<int>,其中 < i n t > <int> <int>表示实例化出一个 i n t int int类型的 v e c t o r vector vector容器。
引入类模板是十分必要的,具体如下:

在这里插入图片描述

二、类模板的基本范式

具体而言,类模板一般含有以下元素:

1.成员变量
2.成员函数
3.自定义类型表
4.构造函数和析构函数
5.运算符重载
6.迭代器接口

这里实现一个自定义的 m y v e c t o r myvector myvector容器,基本代码如下:

template<typename T>
class myvector {
public://类型表typedef T* myiterator; //迭代器名称(指针)
public://构造函数myvector() {};myvector(myvector const&){};//赋值运算符myvector& operator=(myvector const&); //也可以写成myvector<T>operator(myvector<T>const&)public://成员函数void myfunc();//静态成员函数static void my_static_func();public://迭代器接口 myiterator begin();myiterator end();};

通常,在类内的函数可以不用添加 < T > <T> <T>类型名,可以省略。
而在类外实现的话就必须加上 t e m p l a t e < T > template<T> template<T>,并且函数名也要带上 < T > <T> <T>,如下,这里实现了静态函数和普通函数的类外实现:

//类外实现
template<typename T>
void myvector<T>::myfunc() { //类外实现需要补充参数<T>std::cout << "调用了myvector的成员函数\n";
}template<typename T>
void myvector<T>::my_static_func() {std::cout << "调用了myvector的静态成员函数\n";
}

更多细节如下:

在这里插入图片描述

三、类模板的实例化

与函数模板不一样,类模板中的成员函数只有被调用的时候才会被实例化,其中构造函数在创建对象的时候被实例化调用。
我们可以用 d u m p b i n dumpbin dumpbin工具来查看是否实例化了类模板函数:

我们这里只创建类,而不调用类内函数

void Test() {myvector<int>vec;}

可以发现:成功实例化了 m y v e c t o r < i n t > myvector<int> myvector<int>的构造函数,而没有实例化类内函数。
在这里插入图片描述

让我们在调用类内部的函数看看:

void Test() {myvector<int>vec;vec.myfunc();myvector<int>::my_static_func();
}

现在,我们实例化了三个函数:

1.构造函数
2.myfunc成员函数
3.my_static_func静态成员函数

具体如下:

在这里插入图片描述


http://www.mrgr.cn/news/17896.html

相关文章:

  • 超越卷积滤波器,HyCoT利用Transformer捕捉高光谱图像的全局依赖性 !
  • leetcode209. Minimum Size Subarray Sum
  • Spring扩展点系列-InstantiationAwareBeanPostProcessor
  • 原码 / 反码 / 补码的介绍及认知
  • Python测试开发基础(三)---random模块
  • SQLi-LABS靶场56-60通过攻略
  • 【网络基础】探索 NAT 技术:IP 转换、NAPT、NAT穿越及代理服务器
  • Windows 11家庭中文版中管理员阻止运行应用程序的问题
  • C++第四十四弹---Lambda表达式的妙用:高效解决编程中的匿名函数问题
  • 去中心化身份验证:Web3时代数字身份的革新
  • Python测试开发基础(一)
  • Ascend显卡创建虚拟vgpu实例
  • 安防监控视频打手机检测算法核心技术打手机检测算法源码、模型简介
  • C++多线程
  • 云原生主键模型:高效、弹性,省钱又省心
  • Oracle rac模式下undo表空间爆满的解决
  • 全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用
  • C++ 编译三环节
  • centos8 install .net8
  • 前端vue中怎么判断接口请求返回的时长