模板
模板分为模板方法和模板类
// 模板方法,模板作为方法参数传递
template<typename T>
T TFunc(T in)
{
return in * in;
}
// 模板函数,模板作为struct或class的类型来传递
template<typename T>
struct TClass
{
T type;
void Print()
{
cout << type << endl;
}
};
C++2.0 动态模板
// 定义一个类型名字为T的动态模板
template<typename T>
// 使用using来声明此模板需要协作的功能
using VEC = vector<T, allocator<T>>;
int main(int argc, char* argv[])
{
VEC<string> VEC{ "DOG", "CAT", "FISH" }; // 等于 vector<string, allocator<string>> VEC
for (auto p = VEC.begin(); p != VEC.end(); ++p)
{
cout << *p << " ";
}
cout << "\n";
}
C++2.0模板作为参数
// 模板作为模板的参数来输入,Root为模板参数
// 模板参数约束类型为class或struct
template<template<class> class Root, typename T>
class TemplateTemplateParams
{
public:
TemplateTemplateParams(Root<T> root, int in)
{
cout << in << endl;
// root...
}
};
// 定义模板作为参数
template<typename T>
class SubTemplate
{
public:
SubTemplate(T in)
{
cout << in << endl;
}
};
int main(int argc, char* argv[])
{
SubTemplate<string> sub = { "CAT" };
TemplateTemplateParams<SubTemplate, string> root = { sub, 34 };
}
类型别名
// 定义一个函数指针,语法returnType(*name)(inType1, inType2);
// 函数指针保存了函数的地址
void(*func1)(int, int);
// C++2.0语法,using name = returnType(*)(inType1, inType2);
// 使用using的函数指针更直观
using func2 = void(*)(int, int);
void TypeAlias(int x, int y)
{
cout << "x:" << x << " y:" << y << endl;
}
int main(int argc, char* argv[])
{
func1 = TypeAlias;// 将TypeAlias的地址赋值到func1
func1(3, 4);
cout << "-----------" << "\n";
func2 f2 = TypeAlias;
f2(4, 3);
}
noexcep关键字
class GrowStruct
{
public:
// vector deque这两种容器在增长的过程中
// 调用移动构造函数和移动声明函数会抛出异常,使用noexcept来强制通关检查
GrowStruct(vector<int> v):_v(v) { }
// noexcept vs的版本要高于2013才支持
GrowStruct(GrowStruct && g) noexcept
{
}
GrowStruct & operator= (GrowStruct && other) noexcept
{
return *this;
}
private:
vector<int> _v;
};
override
class Root
{
public:
virtual void Func()
{
cout << "Root" << endl;
}
};
class Sub : Root
{
public:
// 当父类有和子类相同的方法的时候,如果子类传入参数不同
// 子类默认这个方法是一个新的方法
void Func(short in)
{
}
// 关键字override修饰的方法必须和父类的名字、声明一致
// 如果有差异,则编译期间报错
void Func() override
{
cout << "Sub" << endl;
}
};
int main(int argc, char* argv[])
{
Sub su = {};
su.Func(); // 调用子类的重写的方法和父类没关系
}
final
// 1.final修饰的class无法被继承
class Root final
{
public:
// 2.final修饰的方法无法被重写
virtual void Func() final
{
}
};
class Sub// : Root !Error with final
{
public:
void Func() //override !Error with final
{
}
};