C++(课程)
c与c++的区别(第一节课)
区别:
- 函数默认值参数是在编译(编译是针对单文件编译的)的时候入进去的
- 默认值参数只能从右向左依次赋值,不能跳过
- 函数的默认值参数只能赋值一次,不能多次赋值
- 由于函数的默认值是在编译时期代入得,所以函数的默认值参数只在本文件下生效
内联函数():
-
无栈帧开辟,直接在调用点编译时期展开(展开的是指令)
-
(DEBUG版本,和正常函数无区别,REALSE版本,调用,函数会在调用点展开)
-
由于内联函数在编译时期展开,编译时期无法获取变量值,因此递归函数无法被处理成内联函数
-
Inline只是对系统的建议,将该函数处理成内联
符号:
-
- 所有数据都会生成符号
- 指令中只有函数名会产生符号
- 全局符号:global符号,所有文件只要引用申明就能使用
- 局部符号: Local只有本文件可见
- Inline函数在debug版本生成的是local符号,如果处理成为内联之后在release版本不生成符号,直接在调用点展开
C/C++各函数:
- 宏函数:
- 预编译时期在调用点展开
- 无法调试
- 没有类型安全校验
- 单文件可见
- 不生成符号
- static函数:
- 不展开
- 可以调试
- 有类型安全校验
- 有栈帧开辟
- 单文件可生成local符号
- 内联函数:
- debug版本不展开,release版本在调用点展开
- 可以调试
- 有类型安全校验
- debug有栈帧开辟,release无栈帧开辟
- 单文件可见
- debug版本生成的是local符号,如果处理成为内联之后在release版本不生成符号
- 普通函数:
- 不展开
- 多文件可见
C和C++相互调用
- C++调用C---->C++产生函数符号(函数名+参数列表),C语言产生函数符号(依靠函数名)
- C语言调用C++
- 如果将C++的函数符号改为C语言的函数符号—需要改动C++源文件(不现实)
- 添加自己实现的C++文件,写C++文件函数作为中间层去调用需要的C++的函数,然后让自实现的C++函数产生C语言符号,之后使用C语言进行调用
函数重载:
- c语言生成函数符号依赖函数名
- c++生成函数符号依赖函数名和参数列表(返回值不影响)
- 函数重载是在编译时期决定的究竟调用哪个函数-静多态一种
数组名与指针的区别:
数组名->地址->常量
指针->变量
C语言中const只能定义常变量,但此常变量不能作为左值,却可以通过指针改变
常量:1.在编译期将常量的值直接写入到常量的使用点2.常量的初始化必须使用常量
1,为什么常量必须初始化?答:编译时期就将常量的值需要写入 常量的使用点
2,如果使用变量给const修饰的量初始化,则该量会退化成常变量(因为变量的值只能在运行时期才能拿到)
3.注:不能泄露常量的地址给非常量的指针,const修饰的类型是离他最近的第一个成形的类型,其余的是他修饰的内容,Const修饰的内容不能作为左值{
int a;
const int* p2 = &a;
}