【C++基础】模板参数与模板继承

模板参数

默认类型参数

函数参数可以设定一个默认值,我们现在可以对类模板的类型参数设定一个默认类型。

指定泛型Stack的默认类型参数为 int

template<typename T = int>
class Stack{...
};

当我们这样定义一个对象时:

Stack<> stack;

使用默认的方式,或者说隐式的方式,实例化了一个stack对象。

这样的好处是:指定默认类型之后,使用者就没必要去写了。

非类型参数

在模板前缀中使用非类型参数。
实例化模板时,非类型实参应该是对象。
如下:

template<typename T, int capacity>
class Stack {...
private:T elements[capacity];int size;
};
Stack<char, 100> charStack;

如同std里面的array的初始化:std::array<int,100>;
除了基本数据类型外,非类型实参是对象的时候是这样的;

template<typename T, Color c>
class Label {...
};
Color color(0,0,255);
Label<char,color> label;

注意,参数默认值必须是在最右边,当然我们也可以全部定义一个默认值,这样就不会有问题了。
注意模板成员函数的声明也需要进行修改。
就是这样:

//泛型化
template <typename T = char,int N = 100>
//编写StackOfIntegers类
class Stack {
private:T elements[N];int size{ 0 };
public:bool empty();T peek();T push(T value);T pop();int getSize();Stack();
};
template <typename T, int N>
Stack<T,N>::Stack() {size = 0;for (auto& i : elements) {i = 0;}
}

模板继承

关于模板继承的几个原则:

1、普通类可从类模板实例继承。一个模板实例化之后就是一个类了,类与类之间可以继承。
2、模板可从普通类继承
3、类模板可继承类模板

也就是说,一个类是不可以从一个模板继承的,其他的三种组合方式都是可以的。
在这里插入图片描述

何时何地使用模板

使用别人写好的模板库时
对不同类型的数据做类似处理 (算法、容器、遍历等)

OOP or GP

泛型编程在C++中广泛使用,经常可以取代面向对象编程。
几乎整个C++标准库都依赖于泛型编程。
在C++标准库较少使用继承和运行时多态。异常、字符串和IO流中使用了较多的继承。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++基础】STL迭代器

已知&#xff1a; STL组成部分&#xff1a; 容器、迭代器、算法、函数对象、空间分配器 容器&#xff1a;用于保存一组数据&#xff0c;数据个体被称为元素 迭代器&#xff1a;用于遍历容器中的元素&#xff0c;容器都有自己专属的迭代器&#xff0c;只有容器才知道如何遍历自己…

office数据集dslr_DSLR的完整形式是什么?

office数据集dslrDSLR&#xff1a;数码单镜反光 (DSLR: Digital Single-Lens Reflex) DSLR is an abbreviation of digital single-lens reflex. It alludes to a digital camera which with the sensor of digital imaging merges optics and mechanism of single-lens reflex…

envs\TensorFlow2.0\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning 解决方案

import tensorflow后的完整报错&#xff1a; D:\Anaconda3\envs\TensorFlow2.0\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, it will b…

生产消费是什么设计模式_快速消费品的完整形式是什么?

生产消费是什么设计模式快消品&#xff1a;快速消费品 (FMCG: Fast-Moving Consumer Goods) FMCG is an abbreviation of Fast-Moving Consumer Goods which are also known as Consumer Packed Goods (CPG). These consumer packed goods allude to the products that are sol…

通过从全局和类内部重载operator new /delete来获取内存管理权

目录1、通过重载获得内存管理权2、容器的内存管理3、重载new、array new、replacement new&#xff0c;接管内存控制权1、重载全局::operator new / ::operator delete以及array版本2、在类里面去重载1、通过重载获得内存管理权 之前的几章学习&#xff0c;是红色的路线。此时…

sml完整形式_教资会的完整形式是什么?

sml完整形式教资会&#xff1a;大学教育资助委员会 (UGC: University Grants Commission) UGC is an abbreviation of the University Grants Commission. It is an organization established by the Indian Union government in agreement with the UGC Act 1956 under the Mi…

erp开发模式_ERP的完整形式是什么?

erp开发模式ERP&#xff1a;企业资源计划 (ERP: Enterprise Resource Planning) ERP is an abbreviation of Enterprise Resource Planning. It is incorporated business management that is executed by a lot of numerous business houses to enhance their productivity an…

关于placement new 和 placement delete的重载,以及basic_string重载new()实例

关于placement new 在https://blog.csdn.net/qq_42604176/article/details/111997397中已经介绍了placement new的形式。 它的形式为new()/delete().我们将分配好内存的指针送入括号中&#xff0c;就完成了初步的调用了。 其实我们可以定义放任何的东西到()内部。只放一个指针…

在eclipse中创建web项目(非myeclipse)

在eclipse中创建web项目(非myeclipse) 在eclipse中如何创建dynamic web project项目 本文的演示是从本地文件创建dynamic web project&#xff0c;从svn检出的同时创建dynamic web project于此类似。我们推荐使用解压版的tomcat6.x版本&#xff0c;来作为服务器。可以到http://…

opengl glut 编译

新建工程glut dll工程&#xff0c;本来想创建lib,工程的&#xff0c;但是想起来&#xff0c;gl是状态机机制。dll方便资源共享等。 添加两个include目录 各种手机电脑平台&#xff0c;网络多媒体开发,mmsplayer&#xff0c;QQ514540005 然后将目录下的lib/glut下面所有的.c文件…

bpo是什么意思_BPO的完整形式是什么?

bpo是什么意思BPO&#xff1a;业务流程外包 (BPO: Business Process Outsourcing) BPO is an abbreviation of Business process outsourcing. It is a convention of a company to another company which is an external provider of services or business operations process…

FireFox插件SQLite Manager的使用

最近几天开始高IOS数据库来着&#xff0c;一开始就CoreData的学习&#xff0c;结果高了一天没有一点进展。 没法&#xff0c;还是先老实代码着吧&#xff0c;不过用的火狐插件可视化数据库的操作也是不错的似乎。 网上搜了搜用法&#xff0c;还真没找到有什么的&#xff0c;最后…

针对一个class写出它的内存管理池以及总结出allocator类(三个版本)

目录示例版本1&#xff1a;per-class allocator,1示例版本2&#xff1a;per-class allocator,2最终版本&#xff1a;static allocator针对版本三进行macro如果我们不针对对象做内存管理&#xff0c;那么我们每次进行Foo* p new Foo(x);时总是会调用malloc函数。 尽管malloc函数…

ubuntu 切换用户的命令[shell, linux]

使用ubuntu过程中免不了和shell(终端)打交道, 也不可避免在各种用户之间进行切换, 从而实现对各帐户的管理, 这个就涉及到了一个比较基础又很重要的工作,怎么样切换用户, 对于LINUX老鸟来说,这个根本不值不提的东东却让新手挠头不已, 现在给出普通用户和超级用户切换的命令(附图…

关于new handler与default、delete关键字

在https://blog.csdn.net/qq_42604176/article/details/111638568的operate_new源代码长啥样中谈到过new handler。 当operator new不能够分配出申请的内存时&#xff0c;会抛出bad_alloc 异常。有的编译器会返回0. 当定义成new(nothrow) Foo&#xff1b;就不会抛异常&#xff…

模式匹配运算符–Shell

转载&#xff1a;http://www.firefoxbug.net/?p722 Var/home/firefox/MyProgram/fire.login.name ${Variable#pattern}:如果模式匹配于变量值的开头处&#xff0c;则删除匹配的最短部分&#xff0c;并且返回剩下的部分 例子&#xff1a; [fire]$ echo ${Var#*/} [fire]$ home/…

VC6、BC5、G2.9标准分配器一览

目录VC6标准分配器BC5标准分配器G2.9标准分配器VC6标准分配器 VCx中源码可以在电脑路径中找&#xff1a; [D:\Program Files\VisualStudio\Community\VC\Tools\MSVC\14.28.29333\include\xmemory] 不过太多了。大概在837行左右有关于allocator代码。还是先看侯捷PPT上的吧。 …

css clear属性_CSS中的clear属性

css clear属性CSS | 清除财产 (CSS | clear Property) We know so much about float property and how it is used for styling our web pages. If you do not remember the float property, lets help jog your memory. The float property is used to set the elements in a …

std::alloc具体细节

G2.9 std::alloc的缺点&#xff1a; 1、在alloc::deallocate中没有将拿到的内存资源还给操作系统&#xff0c;在多任务中将占用很大资源 2、alloc::deallocate函数没有检查传入的p指针的有效性。在这里它默认p为alloc::allocate取得。 如果p并非alloc::allocate取得&#xf…

修改函数的返回地址

这篇随笔源自今天看的这篇文章http://www.cnblogs.com/bluesea147/archive/2012/05/19/2508208.html 1. 如何修改函数返回地址 今天主要写测试程序思考和验证了一下这个问题&#xff0c;先看一下这个&#xff23;程序 1 #include <stdio.h>2 void foo(){3 int a,…