CPP/C++学习笔记01
主要内容:命名空间、缺省参数、函数重载、引用和内联函数
2024.08.16
- 命名空间
namespace bit
{
int x = 0;
}
解决命名冲突
struct结构命名空间要放在变量名前,而不是struct前面
using namespace bit;
命名空间里还可以套命名空间
命名空间会自动合并
总结:
有三种使用命名空间的方法
bit::rand
using namespace bit; //全部展开
using bit::rand; //部分展开
展开的意思是main函数里的变量除了可以去全局里找,也可以去给定的命名空间里找,并不是main里的变量直接就是用命名空间里的变量。 - 备注:
cpp文件下,包含任何一个C++头文件之后,编译器会默认加入C语言标准库,所以我在包含<iostream>之后,不用再include <stdio.h>也能使用printf。 - 缺省参数
full default parameters
partial default parameter
声明与定义分离的时候,声明给,定义不给
头文件里不能包含函数的实现,因为这样会造成链接错误
2024.08.17
- 函数重载 function overloading
要求:
函数名相同,参数不同
参数类型不同
参数个数不同
参数类型顺序不同
要求在同样的作用域(命名空间)
- 第二期开始
- 备注:
条件编译的语句只能保证一个源文件里某个头文件不会被expand多次,但不会影响到别的源文件中该头文件的展开
为什么C++支持函数重载
2024.08.19
- 为什么C++支持函数重载
因为C语言是直接用函数名作符号表中的名字,而C++是用修饰过后的名字 - 引用
传值传参
引用传参
传址传参
2024.08.20
- 输出型参数
- 引用
1. 引用在创建的时候必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用某个实体,再不能引用其他实体 - 引用作返回值
1. 传值返回
传值返回不是直接将即将销毁的栈帧里的值直接拷贝给上一级栈帧中的变量,而是先传给一个临时变量。这个变量如果比较小,有可能存放在寄存器当中,或者在上一级栈帧中专门开辟一个空间存放这个临时变量。如果比较大,有可能存放在即将销毁的栈帧和上一级中间的存储空间。
2. 引用返回
总结:
int func();
int 接收返回值,是接受一个临时变量
int& 接收返回值,int&是这个临时变量的引用
int& func();
int 接收返回值,是接受上一级栈帧中的变量,这个值是随机的,取决于编译器如何处理已经结束的栈帧
int& 接收返回值,int&是上一级栈帧中的引用,相当于野引用,int&中的值是随机的,因为上一级结束的栈帧已经返回给操作系统了
调用函数是先传参,传参的时候还没有建立栈帧,所以如果某个编译器对已经结束的栈帧没有经过任何处理的话,那么cout还是会打出和返回值一样的结果
注:
如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回
传引用传参
1. 提高效率
2. 输出型参数(形参的修改,影响了实参)
传引用返回
1. 提高效率(出了函数作用域才可以使用传引用返回)
2. 修改返回对象
常引用
引用和指针在底层汇编代码的实现是一样的
指针和引用的差别:
1. 引用概念上定义一个变量的别名,指针存储一个变量地址
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
7. 有多级指针,但是没有多级引用
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全 - 内联函数
宏函数
#define ADD(x, y) ( (x) + (y) )
缺点:
1. 容易出错,语法坑多
2. 不能调试
3. 没有类型安全的检查
优点:
1. 没有类型的严格限制
2. 针对频繁调用的小函数,不需要建立栈帧,提高效率
2024.08.21
- 内联函数
展开不展开(也就是创建不创建栈帧)由编译器来决定
编译器如果所有内联函数都展开(类似于宏替换)的话,会造成代码膨胀的问题,程序会变大,安装包会变大
内联函数不能声明和定义分离
建议在C++中,用inline, const and enum来替代宏