06_namespace
同一个企业两个独立的工作小组进行项目开发时,难以避免类、全局变量、函数重名的现象。为解决这个问题,C++发明了命名空间机制。也就是独立的工作小组可以将所有关于类、函数、变量的命名放在一个命名空间内(封装起来)。这样即使和企业的其他的工作有组在命名上有冲突,也不会引起编译器歧义。
07_template 模板类
在设计类中某些数据的类型不确定时, 可以将其全部抽取出来,当使用的时候才指定其类型(允许使用者指定)。 这样的类叫做模板类,或者类模板。(这属于泛型编程。)
08_function template 函数模板
在设计函数中某些数据的类型不确定时, 可以将其全部抽取出来,当使用的时候才指定其类型(允许使用者指定)。 这样的类叫做函数模板。函数模板的使用要比类模板更加简便,因为函数模板在使用时不需要指定类型。编译器会根据传递的参数进行实参推导(argument deduction)。模板只是一个半成品,它自身编译的时候可以通过,但是后面实际使用的话,还要再次编译,能不能够编译通过还要依靠后续的程序代码。
09_member template 成员模板
在标准库的许多构造函数中使用了成员模板。成员模板指的是,在类模板的基础上,类定义的某些成员的类型不确定,也定义成模板。相当于类模板是一个大的模板,而成员模板是一个小的模板,类模板确定以后,成员模板中的成员类型才可以随之确定。例如设计四个类:鱼类,鲫鱼,鸟类,麻雀。当模板类确定为鱼类时,成员模板可以确定为鲫鱼。当模板类确定为鸟类时,成员模板可以确定为麻雀。
总结:模板其实有三种:类模板、函数模板、成员模板。
10_specialization 模板特化
特化指的是,在某些情况下,代码执行的效率会非常高,因此我们把满足这些条件的情况单独写了一段处理代码。当编译器既可以找到泛化的代码(模板),又可以找到特化的代码(满足一定的条件)时优先编译特化的代码。模板特化的语法如下图所示。
template <class Key>
struct hash
{...};
template<>
struct hash<char>
{
size_t operator()(char x) const { return x; }
};
template<>
struct hash<int>
{
size_t operator()(int x) const { return x; }
};
template<>
struct hash<long>
{
size_t operator()(long x) const { return x; }
};
cout<<hash<long>()(1000);//创建一个临时对象
例如上述代码,hash类有4个版本,第一个是泛化版本,后三个是特化版本。当编译器执行最后一句代码
(cout<<hash<long>()(1000);//创建一个临时对象)时,因为传递的数据类型为long,因此直接使用long版本的特化代码,而不使用第一个版本的泛化代码。
注意:(1)特化和泛化是相反的定义。
(2)特化可以由多个版本。
(3)泛化一般视面向全局的,叫全泛化。而特化一般是面向局部的,叫偏特化,或者叫局部特化。
11_模板偏特化
本文介绍了C++中的命名空间机制,用于解决不同工作小组间的命名冲突问题。同时,详细阐述了模板的三大类型:类模板、函数模板和成员模板,以及模板特化和偏特化的概念,强调了模板在提高代码复用性和效率上的作用。
1万+

被折叠的 条评论
为什么被折叠?



