1、普通函数与模板函数调用原则

  1. 函数模板可以像普通函数一样被重载
  2. 当函数模板和普通函数都符合条件时,编译器优先考虑普通函数;
  3. 但如果函数模板产生一个更好的匹配,则选择函数模板;
  4. 可以通过空模板实参列表的语法,限制编译器只通过模板匹配;使用类型列表, max<>(a,b),强制要求使用函数模板;
  5. 当都不满足类型条件时,会调用普通函数;因普通函数的调用,可以进行隐式的类型转换;函数模板的调用,使用类型参数化,严格按照类型进行匹配,不会进行类型的自动转换;

  函数模板本质:

  • 编译器中的汇编,根据函数模板帮程序员生成 不同类型 函数;
  • 具体是进行两次编译:在声明时对模板代码本身进行编译,在调用时对参数替换后的代码进行编译;
  • 函数模板可以和普通函数一样发生重载;

 2、模板类的派生

  需要具体化模板类,知道父类的数据类型,才知道如何分配内存。

class B : public A<int>
{
public:
B(int a, int b) :A<int>(a)//类模板派生需要重新定义构造函数
{ }
private:
int b;
};

3、类模板函数

  在类外声明,友元函数在类外声明(友元函数只用于输入输出的运算符重载,不可用于其他函数)

  如果分开写,函数实现在另一个文件时,类模板函数需要包含 .cpp 文件。

#include <iostream>
#include <typeinfo>
using namespace std; template <typename T>
class Complex
{
// 对于友元函数,类模板的运算符重载需要加上 operator<< <T>
friend ostream & operator<< <T> (ostream &out, Complex &c);
public:
Complex(T a, T b);
Complex operator+(Complex &c); void printCom();
private:
T a;
T b;
};
// 类模板的构造函数,在类的外部
template <typename T>
Complex<T>::Complex(T a, T b)
{
this->a = a;
this->b = b;
}
// 模板类的函数,要把 返回的类型具体化参数化
template <typename T>
Complex<T> Complex<T>::operator+(Complex<T> &c)
{
Complex temp(c.a + a, c.b + b);
return temp;
} template <typename T>
void Complex<T>::printCom()
{
cout << "a: " << a << "\nb: " << b << endl;
} //友元函数的
// 模板是两次编译的,第一次编译和第二次的生成函数头不一样,
template <typename T>
ostream & operator<< (ostream &out, Complex<T> &c)
{
out << "a: " << c.a << "\nb: " << c.b << endl;
return out;
} void main()
{
Complex<int> c1(, );
Complex<int> c2(, ); Complex<int> c3 = c1 + c2;
c3.printCom();
cout << c3 << endl; system("pause");
}

4、类模板中的 static 关键字

  static关键字是属于一个类的,当调用类模板时,每种参数都会调用自己的 static 关键字。

  static T a;

  T AA<T>::a = 0;

C++(四十三) — 函数模板机制的更多相关文章

  1. C++_进阶之函数模板_类模板

     C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...

  2. C++复习:函数模板和类模板

    前言 C++提供了函数模板(function template).所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表.这个通用函数就称为函数模板.凡是函数体 ...

  3. C++编译器模板机制剖析

    思考:为什么函数模板可以和函数重载放在一块.C++编译器是如何提供函数模板机制的? 一.编译器编译原理 什么是gcc gcc(GNU C Compiler)编译器的作者是Richard Stallma ...

  4. C++编译器函数模版机制剖析 - 函数模版的本质

    思考:为什么函数模板能够和函数重载放在一块.C++编译器是怎样提供函数模板机制的? demo 1 #include <cstdio> #include <iostream> u ...

  5. c++的函数模板和类模板

    函数模板和普通函数区别结论: 函数模板不允许自动类型转化 普通函数能够进行自动类型转换 函数模板和普通函数在一起,调用规则: 1 函数模板可以像普通函数一样被重载 2 C++编译器优先考虑普通函数 3 ...

  6. C++:模板——函数模板1

    一.为什么使用函数模板 假设我们在程序中需要比较两个变量的大小,但变量的类型可能是int.float或者double,此时为了满足程序的要求我们可能会在程序中编写多个函数,如: //比较两个int型变 ...

  7. C++函数模板详解(一):概念和特性

    函数模板是指这样的一类函数:可以用多种不同数据类型的参数进行调用,代表了一个函数家族.它的外表和普通的函数很相似,唯一的区别就是:函数中的有些元素是未确定的,这些元素将在使用的时候才被实例化.先来看一 ...

  8. 读书笔记_Effective_C++_条款四十五:运用成员函数模板接受所有兼容类型

    比如有一个Base类和一个Derived类,像下面这样: class BaseClass {…}; class DerivedClass : public BaseClass {…}; 因为是父类与子 ...

  9. C++(四十二) — 函数模板多态

     1.函数模板(参数多态) 相当于一个函数发生器,参数多态,可以重载. 普通函数和模板函数的本质区别: 普通函数的调用,可以进行隐式的类型转换: 函数模板的调用,使用类型参数化,严格按照类型进行匹配, ...

随机推荐

  1. VS Code中配置python版本以及Python多版本

    VS Code中配置python版本VS Code十分方便配置python的版本:可以选在在本地setting.json或者全局setting.json文件中配置:python.pythonPath在 ...

  2. [LeetCode] 313. Super Ugly Number 超级丑陋数

    Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...

  3. 【SSH进阶之路】Spring的IOC逐层深入——为什么要使用IOC[实例讲解](二)

    上篇博客[SSH进阶之路]Spring简介,搭建Spring环境——轻量级容器框架(一),我们简单的介绍了Spring的基本概念,并且搭建了两个版本的Spring开发环境,但是我们剩下了Spring最 ...

  4. 使用objcopy实现将文件编译进执行程序

    一.简介  工作中可能遇到将一个文件编译进执行程序的需求,例如bin文件.jpg文件等等.实现的方法可以使用脚本来将文件内容写入一个新的C源文件数组,达成编译进程序的目的. 现在介绍一种简单.快捷的方 ...

  5. mysql查看和修改最大连接数

    查看最大连接数 SHOW VARIABLES LIKE '%max_connections%'; 修改最大连接数 ;

  6. 嵌入式qt显示中文和隐藏鼠标

    最近项目快接近尾声了,要把项目移植到板子上,但是板子上的系统没有安装字库,导致中文无法显示,并且有一个很讨厌的鼠标光标(又没有鼠标),上网找了一些解决方案,记录一下 qt显示中文: 如果你急于在ARM ...

  7. 大型web项目构建之负载均衡

    日常开发和学习中经常会听到或者会看到“负载均衡”这个词汇,但是对于很多初级每天只面对增删改代码的开发人员来说,这个词汇好像离我们很遥远又很接近,很多人多多少少都有点一知半解 我结合以前在开发中遇到的场 ...

  8. python中将已有链接的视频进行下载

    使用python爬取视频网站时,会得到一系列的视频链接,比如MP4文件.得到视频文件之后需要对视频进行下载,本文写出下载视频文件的函数. 首先导入requests库,安装库使用pip install ...

  9. HTML常用技巧

    1. 为网页链接添加快捷键:accesskey 属性 https://zhidao.baidu.com/question/2267343500557447508.html 2. 键盘事件设置快捷键:h ...

  10. 《Docker Deep Dive》Note - Docker 引擎

    <Docker Deep Dive>Note Docker 引擎 1. 概览 graph TB A(Docker client) --- B(daemon) subgraph Docker ...