C++入门(命名空间缺省参数函数重载引用内联函数)
Posted yumoz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++入门(命名空间缺省参数函数重载引用内联函数)相关的知识,希望对你有一定的参考价值。
命名空间
使用命名空间的目的是对标识符的名称进行本地化,以避免冲突或名字污染。
如下图所展示,用命名空间对scanf进行隔离,于是在main函数中就可实现打印命名空间中定义的值了。因为yumoz::scanf中的“::”是阈作用限定符,所以打印结果是0,否则打印的就不是命名空间中定义的值。
从上述代码可以让你对命名空间有了一个简单的了解,下面给出几种命名空间的使用方式:
- 对命名空间的指定展开:
- 部分展开和指定展开
使用using yumoz::val展开val,而对ch进行指定展开。
- 全部展开
使用using namespace yumoz;进行全部展开。
对比上述三种展开方式
- 指定展开,虽然麻烦,但是相对规范
- 部分展开,对常用的库内容展开,方便
- 全部展开,在工程中不推荐
缺省参数
定义:在声明或定义函数时为函数的参数指定一个默认值。在调用函数时可以方便使用。下面给出缺省参数的几种情况:
- 全缺省参数
- 半缺省参数
下图所示半缺省参数,缺省的是函数中从左往右第一个参数,所以调用时第一个参数必须给定,如TestFun(1),不让函数调佣就会出错。
缺省参数不能在函数声明和函数定义中同时出现。
缺省值必须是常量或者全局变量。
函数重载
C++允许在同一个作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型或顺序)必须不同。下面给出函数重载的几个例子
- 函数的参数类型不同:
int Add(int a, int b)
{
return a + b;
}
double Add(double a, double b)
{
return a + b;
}
- 函数的参数个数不同:
int Add(int a, int b,int c)
{
return a + b + c;
}
int Add(int a, int b)
{
return a + b;
}
- 函数的参数顺序不同:
省略例子。
- 读者可以思考为什么C++支持函数重载而C语言不支持呢?
答:因为在C语言中,采用gcc编译完成后,函数的修饰没有法神改变,C++语言中,函数名字的修饰规则发生的改变,编译器将函数参数类型信息添加到修改后的名字中。下面给出在Linux环境下函数名字修饰的例子:
在CPP环境中的修饰规则如下展示:
其中 <_Z3Addii> 是第一个函数的修饰后结果,**<_Z3Adddd>**是第二个函数修饰后结果。容易发现修饰规则为:<_Z3Addii>中_Z+函数长度(3)+函数名(Add)+类型首字母(i,i)。对于<_Z3Adddd>分析修饰规则知:_Z+函数长度(3)+函数名(Add)+类型首字母(d,d)。
对比C语言的处理过程如下图:
C语言发现修饰后,名字不变。
总结:C++支持重载,而C语言不支持重载原因如上图所示。
引用
引用就是给变量起别名。
使用规范:
- 引用在定义时必须初始化。
- 一个变量可以有多个引用。
- 引用一旦引用一个实体,再不能引用其他实体。
int a = 1;
int d = 2;
int &ra = a;//ra是a的引用
int &rc = a;//a还可以有引用rc
//int &rc = d;//rc重定义,多次初始化,错误
常引用
注意:隐式类型转换会产生临时变量。
引用使用场景
- 做参数
- 做返回值
引用做返回值需要特别注意:如果函数返回时,出了函数作用域,返回对象还给了系统,则必须使用传值返回。如果函数返回时,出了函数作用域,返回对象没有还给了系统,则可以使用引用返回。展示图如下:
- 传值和指针作为传参以及返回值类型上效率相差很大。相比来说传引用效率要高,是因为传值时,在传参期间,函数不会直接传递实参或者将变量本省直接返回,而是传递实参或者返回变量的一份临时拷贝,所以传值作为参数或者返回值类型时,效率比较差。
引用和指针区别
语法层:引用是一个别名,没有独立空间,和其引用实体共用同一块空间。
低层上:引用是按照指针方式实现的。
总结:
- 引用在定义时必须初始化,指针没要求。
- 没有空引用,但是有空指针。
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
- sizeof测量时,引用结果为引用的类型大小,指针大小在32位平台小占4个字节。
- 引用自加即引用实体增加1,指针自加即指针向后偏移一个类型的大小。
- 引用相比指针更加安全。
- 访问实体方式不同,指针需要解引用,引用编译器自己处理。
- 有多级指针,没有多级引用。
关于引用的知识,目前就这么多,如还有,后续继续补充。
内联函数
使用场景:推荐在C++中频繁使用的小函数中使用。
在程序编译时,C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提高程序运行效率。
-
思考:C语言中宏函数有什么缺点?为什么C++要用inline函数?
答:宏的缺点1)不支持调试(预处理阶段展开了)、2)宏语法复杂,容易出错、3)没有类型安全的检查。 -
思考:inline函数既然这么好,那么可以将所有C++函数都使用inline函数替代吗?
答:不可以,开始已经说明,inline函数适合C++中频繁调用的小函数。inline函数是一种以空间换时间的做法,虽然节省了函数调用的开销,但是如果代码很长或者循环递归的函数时,不适合使用inline函数。
注意:inline函数不建议声明和定义分离。因为inline被展开,没有函数地址,链接就会出错。
** 说明:以上总结是本人的一些学习笔记,如有问题欢迎讨论。
以上是关于C++入门(命名空间缺省参数函数重载引用内联函数)的主要内容,如果未能解决你的问题,请参考以下文章
C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for)
C++ 初阶 新语言入门介绍:命名空间,(全/半)缺省函数,函数重载,引用,内联,auto
C++ 初阶 新语言入门介绍:命名空间,(全/半)缺省函数,函数重载,引用,内联,auto