为什么要给常量初始化?
在编译期将常量的值直接写入到常量的使用点
常量的初始化必须使用常量,如果使用变量就会退化成常变量
常量会占内存
指针和数组名的区别------什么是指针
数组名---地址---常量---39323987
指针---变量
const修饰额内容不能作为左值
不能泄漏常量的地址给非常量的指针
const修饰的类型是离他最近的第一个成型的类型,
其余的是他修饰的内容
如果const修饰的内容不包含指针,则无法参与类型
int* p1 = &a;
const int* p2 = &a;
int const* p3 = &a;
int* const p4 = &a;
int* q1 = &a;
const int* q2 = &a;
int const* q3 = &a;
int* const q4 = &a;
const修饰的内容不能作为左值;const修饰离他最近的第一个成型的类型,类型以外的就是修饰的内容
p1=q1 p2=q1 p3=q1 p4=q1
p1=q2 p2=q2 p3=q2 p4=q2
p1=q3 p2=q3 p3=q3 p4=q3
p1=q4 p2=q4 p3=q4 p4=q4
p1=q2;会泄露常量地址给非常量指针。
不能泄露常量地址给非常量指针
如果const修饰的内容不包含指针,则无法参与类型
引用
引用的底层是一个指针
在使用到引用的地方,编译期会自动替换成底层指针的解引用
引用为什么必须初始化?
引用在编译器会自动替换成底层指针的解引用,初始化以后再也无法改变底层指针的指向
//引用为什么一旦初始化就无法改变引用的方向?
不能用非常量的指针去引用一个常量
当引用一个不可以取地址的量的时候,使用常引用
会生成一个临时量
引用临时量
临时量都有常属性
* 编译链接过程
* 函数调用过程
面向对象
运算符重载
模板
继承与多态
STL 容器 泛型算法 函数对象
智能指针
函数的区别(c和c++)
//函数默认值参数
在函数声明或定义的时候,给定参数默认值,如果实参传递的时候,不给该形参传值,
否则会按默认值传参
函数参数的默认值是在编译期生成指令的时候直接生成入参指令
函数参数的默认值只能传递常量
函数的默认值参数只能从右向左依次赋值,不能跳过
默认值参数在同一作用域只能赋值一次,不能重复赋值。
因为函数参数的默认值是在编译期代入的,所以函数参数的默认值只在本文件生效
内联函数
在realse版本(发行),在调用内联函数的时候,该函数会在调试点展开——编译时期展开
在debug版本(调试),内联函数和正常函数调用方式一致
由于内联函数在编译期展开,在编译期无法获取变量的值,而递归函数的终止条件一定需要变量参与,
所以递归函数不可能被处理成内联函数
inline只是对系统的建议,建议将该函数处理为内联。
inline函数在debug版本生成的是local符号,如果处理为内联之后在release版本不生成符号,
直接在调用点展开
符号:所有的数据都会生成符号,指令中只有函数名会生成符号
全局符号:global符号 所有的文件只要引用声明就可以使用
局部符号:local符号 只有本文件可见
数据
指令
*******宏函数
预编译时期在调用点展开
无法调试
没有类型安全校验
没有栈帧开辟
单文件可见
不生成符号
******static函数
不展开
可以调试
有类型安全校验
有栈帧开辟
单文件可见
local符号
*******内联函数
debug不展开,release在调用点展开
可以调试
有类型安全校验
debug有栈帧开辟,release没有栈帧开辟
单文件可见
debug生成local,release不生成
******普通函数
不展开
可以调试
有类型安全校验
有栈帧开辟
多文件可见
生成符号
/*
函数重载
函数名相同,参数列表不同
函数重载实在编译时期决定的究竟调用哪个函数——静多态的一种
C语言生成函数符号依赖函数名
C++生成函数符号依赖函数名和参数列表(返回值不影响)
*/