基础知识不谈了,主要写些重点。
重载函数的参数个数,参数类型,参数顺序三者中必须至少有一种不同。
class不可省略
template<class T1,T2>
是错误的,T2前也需要加class
继承的类前也需要写template
其实是可以不用template的,但是不用的话就需要在继承的基类的尖括号里注明类型,总之无论是具体类型还是模板,都是需要注明类型的。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
template<class T> //类外定义模板
class Animal{
public:
void Jiao(){
cout << mAge << "岁动物在叫!" << endl;
}
public:
T mAge;
};
template<class T>
class Cat : public Animal<T>{};//继承
int main(void)
{
Cat<int> cat;
return 0;
}
模板类的外部实现
模板类的内部定义没什么好说的,在类前价格template就行。而在类模板外部实现的时候,如下
template<class T> //外部实现,构造函数没有返回类型
Person<T>::Person(T age, T id){
this->mID = id;
this->mAge = age;
}
不要滥用友元+模板的组合
因为有些复杂,不符合普通规则
重载与const
顶层const区别不了形参。如
int func(int);
int func(const int );//错误,重复声明
int func(int*);
inr func(int* const);//错误,重复声明。
如果形参是某种类型的指针或引用,可以通过区分指向的是常量对象还是非常量对象实现函数重载,此时的const是底层的
int func(int&);
int func(const int &);//新函数,作用于常量引用,const是底层的
int func(int *);
int func(const int* );//新函数,作用于指向常量的指针,const是底层的
即编译器可以通过实参是否是常量来推断应该调用哪个函数。
重载的作用域
茅厕每行的同名函数会把外层的同名函数隐藏,哪怕形参类型不一样。而且变量也会把外层函数隐藏掉。