C++听课笔记之二(候捷主讲)

本文介绍了C++中的命名空间机制,用于解决不同工作小组间的命名冲突问题。同时,详细阐述了模板的三大类型:类模板、函数模板和成员模板,以及模板特化和偏特化的概念,强调了模板在提高代码复用性和效率上的作用。
摘要由CSDN通过智能技术生成

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_模板偏特化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值