C++零散知识汇集的目的
记录一些C++中不足以独立文章去写但又重要的知识点,汇集在一起。
重要的知识点, 在我看来基本是 工作中容易疏忽犯错的点、容易忘记的点、晦涩冷僻忽略的点以及面试容易问到的点
一、引用和指针的异同
相同点:
通过指针和引用均可以指向某个对象 。均可以实现引用传递避免对象copy开销。
区别:
内存占用: 指针占用内存,引用仅仅是一个别名不占用内存
初始化: 指针定义时可以不用初始化,后续可以多次复制。引用必须在定义时绑定某个对象且生命周期内不能再绑定其他对象。
安全性: 指针可能为空需要判断安全性,而引用可以相对安全直接操作访问
sizeof: 指针返回指针占用的大小 而引用返回的是指向对象的大小。
const修饰: 指针本身是一个对象,可const ptr修饰该指针只读, 也可ptr const修饰指针指向的对象只读。引用只是一个别名,只能修改指向的对象只读。
二、强制类型转换
c语言中全部通过(type cast)方式做强制类型转换,c++细分为四种强化类型转换,个人理解这样做的好处是更严格更清晰直观的知道做的对应的转换,细分后的强制转换功能更强大,更安全。
static_cast 最常用的强制类型转换,当type可以被显式或隐式转换才能转换。
const_cast 去const转换,将常量对象转换为非常量对象
reinterpret_cast 可以改变指针类型 或将整型转换为指针 or指针转换为整型。这种转换属于危险性转换,适用于
依赖于实现的底层编程技术,是不可移植的。
dynamic_caset 适用于多态的转换
三、 assert断言
assert(express) 用于调试 当表达式false时进程停止执行 对于release版本设置 NDEBUG宏可以关闭