C++_PRIMER 整理总结
地址
数组的地址
数组名被解释为其第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址
![p1.jpeg](https://s2.loli.net/2022/03/17/aAvbCdRE8m5QMgK.jpg)
![p2.jpeg](https://s2.loli.net/2022/03/17/keQErAYgDtIP3v5.jpg)
运算符
运算符区别
箭头成员运算符(->) 配合结构体指针使用
.运算符配合结构体名称使用
ps是指向结构体的指针,则*ps就是被指向的值--结构本身
*ps是一个结构,(*ps).price
是该结构的price成员
结合
指针与运算符的结合
![p3.jpeg](https://s2.loli.net/2022/03/17/FxySP2KHvIAwTRO.jpg)
![p4.jpeg](https://s2.loli.net/2022/03/17/S2Rl64PvuyMZBAV.jpg)
指针(包括数组名)加1,实际上是加上了一个与指针指向的类型的长度相等的值.
数组与指针对应的优势:将数组地址作为参数可以节省复制整个数组所需的时间和内存.
P214 整理 数组与指针
const
常量指针与指针常量的区别
![p6.jpeg](https://s2.loli.net/2022/03/17/oEyiJztPjdsMUrR.jpg)
指针指向的内容,不能通过指针来进行改动.但是能通过其他方式改动值.
![p7.jpeg](https://s2.loli.net/2022/03/17/kzrfmLjRYHKAq4N.jpg)
此时pt指针的值可以修改,但是只能指向一个变量.
const在*
前面,表示不能通过pt指针修改值,const指针在*
后面,标志pt指针不能修改指向
出现const int *const pt
的情况,即不能修改const指针的值,又不能修改其指向.
函数指针
函数指针
|
|
运行结果
![p8.jpeg](https://s2.loli.net/2022/03/17/OfY1c4QV37hrekF.jpg)
区别于混淆
(*pa[2])(av,3)
与*pa[2](av,3)
的区别
(*pa[2])(av,3)
根据结合性 []
优先级高于*
,优先与pa结合
pa是数组,pa[2]是数组的第三个元素,这个元素是一个函数指针,指向f3的函数指针,*pa[2]
是f3函数本身,f3(av,3)则是返回其第三个元素的地址
结果:第三个元素的地址
*pa[2](av,3)
根据结合性pa[2](av,3)
先结合 再与指针结合
pa[2]是指向f3的指针,结合后是f3(av,3),重点对于函数指针,f3()
与*f3()
是完全一致的,f3(av,3)计算了数组中第三个元素的地址,再结合*,就是第三个元素返回的的值
结果:第三个元素的值
引用
引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名.这种传递参数的方法称为按引用传递.按引用传递允许被调用的函数能够访问调用函数中的变量.
如果声明将引用指定为const,c++将在必要时生成临时变量.
使用引用参数的主要原因:
- 能够修改调用函数中的数据对象
- 通过传递引用而不是整个数据对象,可以提高程序的运行速度
按值传递的指导原则:
传递在使用时的技巧:
- 如果传递的是数组,就用指针
- 如果传递的是类,就用引用
- 如果传递的是结构体,指针和引用都可以
- 如果要传递一个基本类型,这个值不想修改就按值传,如果想修改就用指针.
右值引用
能用取地址值&
操作的 就是左值,不能的是右值.
如果想使用左值引用,但是等号右侧的值,无法取地址操作,使用const
常引用.
|
|
只能通过引用来读取数据,不能通过引用来修改数据.
c++11引入了右值引用的概念 两个&&符号定义右值引用.
|
|
重载解析
对于函数重载/函数模板和函数模板重载,C++的策略
从最佳到最差的匹配顺序:
- 完全匹配,但常规函数优先于模板
- 提升转换
- 标准转换
- 用户定义的转换,如类声明中定义的转换