C++ 11(2.0)新特性 06(模板、类型别名、noexcept override final)


模板

模板分为模板方法和模板类

// 模板方法,模板作为方法参数传递
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
	{
		
	}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值