11.21 位操作 函数重载&引用&内联函数

1.操作符优先级
单目运算符>双目运算符>移位>大与小
2.移位操作
逻辑移位和算术移位
逻辑移位:针对的是无符号类型的数据
左移:丢弃最高位,低位补0
右移:丢弃最低位,高位补0
算术移位:针对的是有符号类型的数据
左移:丢弃最高位,低位补0
右移:丢弃最低位,如果该数字是正数高位补0,如果是负数高位补1
3.缺省参数
(1)概念:在声明或定义函数时,给函数的参数设置一个默认值,当用户对函数进行调用时,如果传递了实参,则使用用户传递的实参;如果没有传递则使用默认值,例子:备胎
(2)分类:
全缺省参数—所有参数都带有默认值
半缺省参数—部分参数带有默认值–规则:必须从右往左依次给出
(3)特性
~缺省参数必须从右往左给出
~不能在函数声明和定义的位置同时给出
~缺省参数在提供时–常量||全局变量
~C语言不支持
4.函数重载
(1)概念
相同作用域,函数名字相同,参数列表必须不同(参数个数,参数类型,类型次序)
(2)调用原理
过程:预处理–>编译–>汇编–>链接–>可执行程序
编译:按照该种语言的语法规则对代码进行语法检查,将代码翻译成汇编指令
汇编:把汇编指令码文件翻译成二进制格式的机器码文件
链接:拼接+解决地址问题

调用原理:编译器在编译代码期间,需要对函数的实参类型进行推演,根据推演的结果选择对应合适类型的函数进行调用。
**注意:**有该函数存在则直接调用,如果不存在类型完全匹配的函数,则编译器会尝试进行隐式类型转换,转换完成后,如果有对应类型的函数则进行调用,否则,编译失败

(3)底层实现原理
C和C++命名规则
C语言:只是在函数名字前加_,C语言不支持函数重载
C++:例如如下函数中

int Add(int left,int right)
{
   return left+right;
}

在VS下命名规则为?Add@@YAHHH@Z,其中Add为函数名,HHH为int类型,NNN为
double类型
(4)extern"C"
在一个C++工程中调用别人采用C语言写的第三方库
作用:告诉编译器,将代码按照C语言的风格进行处理

5.引用
(1)概念
引用是一个别名,不是新定义一个变量,编译器不会给引用变量重新分配空间,引用变量与其引用的实体公用同一份内存空间
例子:别名
(2)特性
引用变量在定义时必须要初始化
一个变量可以有多个引用----一个人可以有多个别名
引用变量一旦引用一个实体之后,就不能再去引用其他的实体
(3)三种传参方式区别
传值
优点:可以对外部实参起到保护作用
缺点:不能通过形参改变外部的实参(因为形参是实参的一份拷贝,在函数体中修改形参实际修改的是实参的一份拷贝),传参的效率低下,而且浪费空间

传地址
优点:可以通过形参改变外部的实参,不需要对实参进行拷贝,传参的效率高,节省空间
缺点:在不需要通过形参改变外部实参的情况下,代码安全性不高,可以避免:使用const

传引用:形参是实参的别名—对形参进行修改可以达到对实参的改变,对于不需要通过形参改变外部实参:const,传参效率高,节省空间,代码可读性高

**注意:**在C++中,一般情况下传参时尽量使用引用
内置类型:
如果需要通过形参改变外部的实参—优先使用引用
如果不需要通过形参改变外部的实参—传值,传引用+const
自定义类型:传参都使用引用—>T&和const T&

6.指针和引用的区别
(1)在底层实现方式上:
引用变量实际是有自己的空间的,该空间中放置的是其引用的尸体的地址
注意:和引用的概念进行区分
实现引用技术:指针方式来实现的
说明:引用和指针在底层实现方式是完全相同的,引用就是按照指针的方式来实现的
从底层实现上看:没有任何区别

(2)在概念和特性以及使用方式上:
~引用概念上定义一个变量的别名,指针存储一个变量地址
~引用在定义时必须初始化,指针没有要求
~引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
~没有NULl引用,但有NULL指针
~在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数
~引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
~有多级指针,但是没有多级引用
~访问实体方式不同,指针需要显式解引用,引用编译器自己处理
~引用比指针使用起来相对更安全

7.宏的优缺点
(1)宏常量
优点:一改全改,常量名字具有一定的含义
缺点:宏常量没有类型的—不会参与到类型检测中—代码的安全性降低,而且一旦编译报错,报错的位置不准确
(2)宏函数
优点:宏函数不是一个真正的函数,在预处理阶段,预处理器已经将宏函数采用宏体进行替换了,少了函数调用参数压栈,开辟栈帧,返回等的开销了,代码的运行效率提高
缺点:
~在实现时,可能会比较麻烦,要导出加括号
~宏函数也没有参数类型–不会有参数类型检测–安全性不高
~宏函数在预处理阶段会展开–不能调试
~宏函数具有副作用

注意:
C++如何解决宏的缺陷
~宏常量—const常量:可以达到宏替换的效果–而且具有类型,更加安全
~宏函数—内联函数
内联函数:在C++中被inline关键字修饰的函数称为内联函数,如果成员函数在类中定义,编译器也可能会将其当成内联函数来处理
特性:在编译阶段,如果编译器将一个函数当成是内联函数的情况下,在编译代码时会对内联函数进行展开,少了函数调用的开销,程序的运行效果提高了

inline:是一个建议性的关键字,当修饰函数时,建议编译器将该函数当成内联函数来进行处理,即:在编译阶段,将该函数展开
inline函数具有文件作用域

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值