2022.5.20 C++——函数模板和namespace

1. 函数模板

为了代码重新使用,代码就必须是通用的;通用的代码就必须不受数据类型的限制。那么我们可以把数据类型改为一个设计参数,这种类型的程序设计称为参数化程序设计。软件模块由模板构造,包括函数模板和类模板。
函数模板的定义:
函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化重载函数的设计。
例如:函数模板定义为:

template<模板参数表>
返回类型  函数名(形式参数表)
{
   ……;//函数体
}

<模板参数表>尖括号中不能为空,参数可以有多个,用逗号分开。模板参数主要是模板类型参数。
模板类型参数代表一种类型,由关键字class或typename(建议用typename)后加一个标识符构成,在这里两个关键字的意义相同,它们表示后面的参数名代表一个潜在的内置或用户设计的类型。
例:
在这里插入图片描述
从图中可以看出,在执行my_max函数时,my_max(10,20)中T就是类型int,my_max(11.11,22.22)中T就是类型double,my_max(‘a’,‘b’)中T就是类型char,这说明,在C++中,只需要给出一个模板,C++在主函数中调用函数时可以自动识别出函数的返回值类型以及形参的类型。也就是说,函数模板根据一组实际类型或值构造出独立的函数的过程通常是隐式发生的,称为模板实参推演,其执行过程如下:
在这里插入图片描述
上述过程就是模板实参推演。
注意:在编译过程中,根据函数模板的实参构造出独立的函数,称为模板函数,这个构造过程被称为模板实例化。

2. 名字空间:namespace

2.1 名字空间定义

在C++中支持三种域:局部域、名字空间域和类域。
名字空间域是随标准c++而引入的,它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字。
如:

namespace dwy
{
    int dm = 10;
    float  fm = 3.14;
    void fun()
    {;
    }
}

其中花括号括起来的部分称为声明块,声明块中包括:类、变量(带有初始化)、函数(带有定义)等,最外层的名字空间域称为全局名字空间域,即文件域。

2.2 为什么引入名字空间

名字空间的引入,主要是为了解决全局名字空间污染问题,即防止程序中的全局实体名与其他程序中的全局实体名发生命名冲突。
如:普通的命名空间
在这里插入图片描述
如:名字空间域可分层嵌套,同样有分层屏蔽作用
在这里插入图片描述
如:同一个工程中允许存在多个相同名称的命名空间(编译器最后会合成同一个命名空间中)
在这里插入图片描述
注意:一个名字空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间。

2.3 名字空间使用

(1)加名字空间及作用限定符
在这里插入图片描述
(2)使用using将名字空间成员引入
使用using声明可只写一次限定修饰名,using声明以关键字using开头,后面是被限定修饰的名字空间成员名:
在这里插入图片描述
在这里插入图片描述
(3)使用using namespace名字空间名称引入
使用using指示符可以一次性地使名字空间中所有成员都可以直接被使用,比using声明方便。
using指示符:以关键字using开头,后面是namespace,然后是名字空间名。
using namespace 名字空间名:
在这里插入图片描述
总结:标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的,在采用标准C++的平台上使用标准C++库中的组件,只需要写一个using 指示符,即
using namespace std;
就可以直接使用标准C++库中的所有成员,这是很方便的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值