【c++基础】笔记(八)

来源:互联网 发布:apache bench 编辑:程序博客网 时间:2024/06/03 20:55

1 函数模板

1.1 模板分类  函数模板  类模板

1.2 template< typename T >   告诉编译器紧跟着下面的函数或类出现T不要报错

1.3 void myswap( T & a ,T &b )

1.4 调用时候 两种方式

1.4.1 自动类型推导,比如推导出T类型才能使用模板,不要出现二义性问题

1.4.2 显示指定类型,myswap<int>( a,b)

1.4.3 模板使用时候必须告诉编译器T的类型,否则无法使用

利用函数模板 实现对通用的数据类型的一个选择排序

2.1 排序规则 从大到小

2.2 排序方式 选择排序

2.3 函数模板

2.3.1 mySort

2.3.2 mySwap

2.3.3 myPrint

3 函数模板与普通函数的区别以及调用规则

3.1 区别

3.1.1 普通函数可以进行隐式类型转换

3.1.2 函数模板不可以进行隐式类型转换

3.2 调用规则

3.2.1 如果普通函数和模板函数都可以匹配,优先选择普通函数

3.2.2 可以通过空模板参数列表方式 强制调用函数模板 myPrint<>(a,b);

3.2.3 函数模板也可以发生重载

3.2.4 如果函数模板可以产生更好的匹配,优先函数模板

4 模板实现机制

4.1 模板并不能对任意的数据类型都进行通用化

4.2 通过模板 产生的函数,叫模板函数

4.3 模板会进行二次编译,第一次编译是模板的本身的代码,第二次会对类型替换后的模板函数进行二次的编译

5 模板局限性

5.1 模板而言并不能做万能的通用

5.2 对于特殊的类型,可以做具体化的一个函数版本

5.3 template<> 返回值 函数名<具体的类型>(具体类型  参数… )

5.4 template<> void mySwap<Person>(Person & a, Person &b)

5.5 对于具体化版本,如果出现和普通模板都可以匹配成功,优先选择具体化版本

6 类模板

6.1 template<> 下面紧跟着的是类,那么就是类模板

6.2 类模板和函数模板区别

6.2.1 类模板在创建对象时候 ,必须用指定显示类型方式,不能进行自动类型转换

6.2.2 类模板中的声明里,可以有默认的值

7 类模板中成员函数的创建时机

7.1 类模板中的成员函数并不是一上来就创建好的

7.2 而是在二次编译期间,替换完T的类型后,才去创建

8 类模板作为函数的参数

8.1 指定传入类型

8.2 参数模板化

8.3 整个类模板化

8.4 查看T类型

8.4.1 cout << "T 类型: " << typeid(T).name() << endl;

类模板-继承中引发的问题以及解决

9.1 父类如果是模板,子类继承时候要指定出父类中的T类型,否则无法分配内存

9.2 语法  class Son :public Base<T2>

10 类模板的类外实现

10.1 返回值 作用域<模板参数,模板参数2>::实现成员函数(){}

11 类模板的分文件编写问题以及解决

11.1 问题:类模板中的成员函数一开始不会被创建,导致分文件编写时候连接不到函数的实现

11.2 解决:将.cpp.h都写到同一个文件中,后缀名改为.hpp

12 类模板碰到友元函数

12.1 友元函数类内实现

12.2 friend void showPerson( Person<T1,T2>&p)

12.3 友元函数类外实现

12.4 声明:

12.4.1 friend void showPerson2<>(Person<T1, T2>&p);

12.4.2 template<class T1, class T2>class Person;

12.4.3 template<class T1, class T2>void showPerson2(Person<T1, T2> & p);

13 类模板应用-实现一个通用的数组

13.1 属性

13.1.1 T * pAddress; //指向堆区的指针

13.1.2 int m_capacity 容量

13.1.3 int m_Size; 大小

13.2 有参构造

13.3 拷贝构造

13.4 析构

13.5 重载 []

13.6 尾插

13.7 尾删

 

原创粉丝点击