模板相关

函数模板的基础语法

为了简化函数的书写,可以选择将类型参数化,编写的代码便可以忽略类型。编译器根据传的值,对类型进行自动推导。

template<class T>
void mySwap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

函数模板与普通函数的区别

  • 函数模板不允许自动类型转换
  • 普通函数能够进行自动类型的转换

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

cpp--预编译器(将include的文件进行整合)>>.i--编译器>>.s(汇编文件)--汇编器>>.obj(目标文件、二进制文件)--连接器>>.exe

函数模板通过具体类型产生不同的函数。编译器会对函数模板进行两次编译,在声明的时候对模板代码本身进行编译,在调用的时候对参数替换后的代码进行编译

类模板

利用类模板来生成派生类的时候,需要明确类型,利用类模板来生成派生类模板的时候就可以不用明确
标准的.h+.cpp的写法中,.h会加上#pragma once以防止头文件重复包含

template<class T>
class Person
{
public:
    Person(T id, T age) {
        this->id = id;
        this->age = age;
    }
    ~Person();
    void Show() {
        cout << this->id << this->age << endl;
    }

private:
    T id;
    T age;
    
};


void main() {
    Person<int> person(10, 20);
}

头文件和cpp文件分离的写法

//Animal.h

#pragma once
#include <iostream>
#include<stdio.h>
using namespace std;
template<class T1,class T2>
class Animal {
public:
    Animal(T1 name, T2 age);
    void Print();
public:
    T1 mName;
    T2 mAge;
};

//Animal.cpp
#include"Animal.h"

template<class T1,class T2>
Animal<T1, T2>::Animal(T1 name, T2 age) {
    this->mName = name;
    this->mAge = age;
}

template<class T1,class T2>
void Animal<T1, T2>::Print() {
    cout << this->mName << this->mAge << endl;
}
  • 注意
    当头文件和cpp文件分离的时候,如果主文件仅仅include头文件,那么他在编译的时候仅仅进行第一次编译,即不会产生实际的运行函数,而只有模板函数,所以为了正确调用,在主文件中需要includecpp文件来保证程序的运行
    当然,也可以将类模板分离写法中的cpp文件改名为hpp

类模板遇到static

类模板中的静态变量只适用于各自的模板,即第二次编译的结果

template<class T>
class Person {
public:
    static int a;
};

template<class T>int Person<T>::a = 0;
void main() {
    Person<int> p1, p2, p3;
    Person<double> pp1,pp2, pp3;
    p1.a = 10;
    pp1.a = 100;
    cout << p2.a << endl;//10
    cout << pp2.a << endl;//100
    getchar();
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。