C++入门(命名空间、缺省参数、函数重载、引用、内联函数)

命名空间

使用命名空间的目的是对标识符的名称进行本地化,以避免冲突或名字污染。
如下图所展示,用命名空间对scanf进行隔离,于是在main函数中就可实现打印命名空间中定义的值了。因为yumoz::scanf中的“::”是阈作用限定符,所以打印结果是0,否则打印的就不是命名空间中定义的值。
在这里插入图片描述
从上述代码可以让你对命名空间有了一个简单的了解,下面给出几种命名空间的使用方式:

  1. 对命名空间的指定展开:
    在这里插入图片描述
  2. 部分展开和指定展开
    使用using yumoz::val展开val,而对ch进行指定展开。
    在这里插入图片描述
  3. 全部展开
    使用using namespace yumoz;进行全部展开。
    在这里插入图片描述

对比上述三种展开方式

  1. 指定展开,虽然麻烦,但是相对规范
  2. 部分展开,对常用的库内容展开,方便
  3. 全部展开,在工程中不推荐

缺省参数

定义:在声明或定义函数时为函数的参数指定一个默认值。在调用函数时可以方便使用。下面给出缺省参数的几种情况:

  1. 全缺省参数
    在这里插入图片描述
  2. 半缺省参数
    下图所示半缺省参数,缺省的是函数中从左往右第一个参数,所以调用时第一个参数必须给定,如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语言不支持重载原因如上图所示。

引用

引用就是给变量起别名。
使用规范:

  1. 引用在定义时必须初始化。
  2. 一个变量可以有多个引用。
  3. 引用一旦引用一个实体,再不能引用其他实体。
int a = 1;
	int d = 2;
	int &ra = a;//ra是a的引用
	int &rc = a;//a还可以有引用rc
	//int &rc = d;//rc重定义,多次初始化,错误

常引用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:隐式类型转换会产生临时变量。

引用使用场景

  1. 做参数
    在这里插入图片描述
  2. 做返回值
    引用做返回值需要特别注意:如果函数返回时,出了函数作用域,返回对象还给了系统,则必须使用传值返回如果函数返回时,出了函数作用域,返回对象没有还给了系统,则可以使用引用返回。展示图如下:
    在这里插入图片描述
    在这里插入图片描述
  • 传值和指针作为传参以及返回值类型上效率相差很大。相比来说传引用效率要高,是因为传值时,在传参期间,函数不会直接传递实参或者将变量本省直接返回,而是传递实参或者返回变量的一份临时拷贝,所以传值作为参数或者返回值类型时,效率比较差。

引用和指针区别

语法层:引用是一个别名,没有独立空间,和其引用实体共用同一块空间。
低层上:引用是按照指针方式实现的。

总结:

  1. 引用在定义时必须初始化,指针没要求。
  2. 没有空引用,但是有空指针。
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
  4. sizeof测量时,引用结果为引用的类型大小,指针大小在32位平台小占4个字节。
  5. 引用自加即引用实体增加1,指针自加即指针向后偏移一个类型的大小。
  6. 引用相比指针更加安全。
  7. 访问实体方式不同,指针需要解引用,引用编译器自己处理。
  8. 有多级指针,没有多级引用。
    关于引用的知识,目前就这么多,如还有,后续继续补充。

内联函数

使用场景:推荐在C++中频繁使用的小函数中使用。
在程序编译时,C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提高程序运行效率。

  • 思考:C语言中宏函数有什么缺点?为什么C++要用inline函数?
    答:宏的缺点1)不支持调试(预处理阶段展开了)、2)宏语法复杂,容易出错、3)没有类型安全的检查。

  • 思考:inline函数既然这么好,那么可以将所有C++函数都使用inline函数替代吗?
    答:不可以,开始已经说明,inline函数适合C++中频繁调用的小函数。inline函数是一种以空间换时间的做法,虽然节省了函数调用的开销,但是如果代码很长或者循环递归的函数时,不适合使用inline函数。

注意:inline函数不建议声明和定义分离。因为inline被展开,没有函数地址,链接就会出错。

** 说明:以上总结是本人的一些学习笔记,如有问题欢迎讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值