C++语言笔记系列之二十——模版

1.随意输入两个数x和y,输出最大值max。

int max(int x, int y)

{return x>y?

x:y;}

2.函数模版

(1)用一种或者多种通用类型去表示函数——函数模版。

(2)函数模版因为没有详细的数据类型。所以函数模版不可执行。

(3)作用:模板就是实现代码重用机制的一种工具,它能够实现类型參数化,即把类型定义为參数, 从而实现了真正的代码可重用性。模版能够分为两类,一个是函数模版。另外一个是类模版。

注:函数模版在调用时必须用详细的类型来替代,使之转换为一个详细函数。

3.函数模版的定义:

template <class T>

A.模版定义的关键词:template

<class T>用来说明一个通用类型T。

B.class T仅仅用来表示一种类型,也能够表示多个通用类型:

<class T1, class T2, class T3, ..., class Tn>

4.函数模版的调用

(1)将函数模版作为一个函数调用。

(2)系统将自己主动依照调用表达式实參的类型来替代函数模版中的通用类型,使之转化为一个详细函数然后运行。

example 1

#include <iostream.h>

template <class T>

T max(T x, T y)

{return x>y?

x:y;}

int main()

{

int x = 3, y = 4;

double d1 = 2.3, d2 = 3.4;

long l1 = 32L, l2 = 35L;

cout<<max(x, y)<<endl;

cout<<max(d1, d2)<<endl;

cout<<max(l1, l2)<<endl;

}

程序输出:

4

3.4

35

分析:因为实參x,y为int类型,系统自己主动将模版中的类型T用int来替代。

函数转化:int max(int x, int y) {return x>y?

:x:y;}

example 2

#include <iostream.h>

template <class T>

void exchange(T &x, T &y, T &z)

{

T t;

if(x>y) {t = x; x = y; y = z;}

if(x>z) {t = x; x = z; z = t;}

if(y>z) {t = y; y = z; z = t;}

}

5.函数模版的重载

(1)函数模版同意隐性类型转换。

(2)函数模版重载时不同意重载为一个模版——函数模版的重载仅仅能够是一个详细的显性函数。

(3)函数模版的重载仅仅能够在函数模版不可调用时,系统将自己主动的通过隐式类型转换后调用函数模版时重载。

example 3

#include <iostream.h>

template <class T>

T max(T x, T y)

{

cout<<"This is T max()."<<endl;

return x>y?x:y;

}

double max(int x, double y)

{

cout<<"This is double max()."<<endl;

return x>y?

x:y;

}

int main()

{

int x1 = 2, x2 = 3;

double d1 = 2.3, d2 = 3.4;

long l1 = 3L, l2 = 5L;

cout<<max(x1, x2)<<endl; //调模版

cout<<max(l1, l2)<<endl; //调模版

cout<<max(x1, l2)<<endl; //调重载

cout<<max(x1, d2)<<endl; //调重载

cout<<max(d1, d2)<<endl; //调模版

}

程序输出:

This is T max().

3

This is T max().

5

This is double max().

5

This is double max().

3.4

This is double max().

3.4

模版的重载仅仅可以有一个详细的函数。

6.类模版

template <class T>

class Tany

{

T x, y;

public:

Tany(T xx, T yy):x(xx),y(yy) {}

T getx() {return x;}

T gety() {return y;}

};

类模板的详细化实现:

(1)通过类模板创建对象时由详细类型替代模版类型。

(2)类模版对象的定义

类名<详细类型>对象名(初始化列表)

若有多个通用类型必须表示多个详细类型

比如:Tany <int> objint(3, 4);

Tany <double> objdouble(3.4, 5.6);

时间: 2024-10-12 10:38:52

C++语言笔记系列之二十——模版的相关文章

C++语言笔记系列之十二——C++的继承

C++的继承 1.继承方式 public(公有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象只能访问基类的public成员. protected(保护继承),private(私有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象不能访问基类的任何成员. 2.例子 example 1: #include <iostream.h> clas

C++语言笔记系列之十六——赋值兼容规则&amp;多继承的二义性

1.赋值兼容规则 (1)派生类对象可以给基类对象赋值,这种情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:但是不允许将一个基类的对象赋值给一个派生类. (2)可以将派生类对象的地址赋给基类指针,使基类指针指向派生类对象,通过基类指针引用成员时只可以引用派生类从基类继承而来的成员,而不允许引用派生类的新成员. (3)引用与指针相同. 2.多继承 (1)一个派生类从两个以上的基类中去继承. (2)说明: class 派生类名:继承方式 基类1, 继承方式 基类2,...... {派生类成员

C++语言笔记系列之十八——虚函数(1)

1.C++中的多态 (1)多态性:同一个函数的调用可以进行不同的操作,函数重载是实现多态的一种手段. (2)联编:在编译阶段进行联接,即是在编译阶段将一个函数的调用点和函数的定义点联接起来. A.静态联编:在编译阶段就完成的函数联编--函数重载. B.动态联编:在程序的运行阶段由系统自动选择具体的函数--虚函数. 注:C++的多态主要指的就是动态联编. 2.虚函数 (1)虚函数是在函数的定义时将其声明为虚函数即可. (2)说明:virtual 数据类型 函数名(参数表) {函数体} A.目的:当

C++语言笔记系列之十四——继承后的访问权限

1.析构函数不继承:派生类对象在析构时,基类析构函数的调用顺序与构造函数相反. 注:派生类对象建立时要调用基类构造函数,派生类对象删除时要调用基类析构,顺序与构造函数严格相反. 2.例子 example 1 #include <iostream.h> #include <math.h> class Point { public: Point(double a, double b, doule c) { x = a; y = b; z = c; } double Getx() {re

C++语言笔记系列之十五——派生类、基类、子对象的构造和析构函数调用关系

例子 example 1 注:若一个基类同时派生出两个派生类,即两个派生类从同一个基类继承,那么系统将为每一个简历副本,每个派生类独立地使用自己的基类副本(比如基类中有属于自己类的静态变量等). #include <iostream.h> class Person { public: person() {cout<<"Construction of person."<<endl;} ~person() {cout<<"Destr

C++语言笔记系列之十——静态成员

1.静态成员 (1)由关键字static修饰 静态变量定义语句在编译阶段就执行,运行过程中不再执行. (2)分类:静态数据成员.静态成员函数. (3)静态成员时类的所有对象共享的成员,而不是某一个对象的成员. 2.静态成员的使用 (1)在定义说明前加上static关键字.例如: static int x: (2)静态数据成员必须进行初始化,并且初始化必须在类外完成. (3)静态数据成员的初始化 数据类型 类名::静态数据成员名 = 值://注意这里没有static出现 (4)绝对不能使用对象名来

C++语言笔记系列之十九——虚函数(2)

1.构造函数和析构函数中调用虚函数 (1)采用静态编译. (2)在编译阶段自动联接自己类中的函数或基类中的函数,不在派生类中重定义一个函数. 注:构造函数和析构函数中调用的虚函数,派生类都不一定存在的情况下,只能去调用基类或者自身的函数. example 1 #include <iostream.h> class A { public: A() {} virtual void func() {cout<<"A construction."<<endl

Powershell管理系列(二十六)PowerShell操作之批量导出&导入邮箱

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 项目中有时候做跨林邮箱迁移的时候,条件不成熟,比如安全考虑或者其他考虑,不能做双林信任,这样就提出了一个问题,历史邮件需要使用的话怎么办,一个简单高效的解决办法就是从源森林批量导出邮件为.pst文件,在批量导入到目的域森林,具体操作如下: 1.赋予管理账号邮件导入导出权限,命令如下: cls whoami New-Manageme

[算法系列之二十四]后缀树(Suffix Tree)

之前有篇文章([算法系列之二十]字典树(Trie))我们详细的介绍了字典树.有了这些基础我们就能更好的理解后缀树了. 一 引言 模式匹配问题 给定一个文本text[0-n-1], 和一个模式串 pattern[0-m-1],写一个函数 search(char pattern[], char text[]), 打印出pattern在text中出现的所有位置(n > m). 这个问题已经有两个经典的算法:KMP算法 ,有限自动机,前者是对模式串pattern做预处理,后者是对待查证文本text做预处