需要时刻牢记的是:函数的形参都是左值,即使它的类型是右值引用,它也是左值,因为它可以被取地址。
主要是区分什么是右值,满足以下二者之一即可: 1. 临时对象 2. 无法位于赋值符号右边的对象
需要时刻牢记的是:函数的形参都是左值,即使它的类型是右值引用,它也是左值,因为它可以被取地址。
主要是区分什么是右值,满足以下二者之一即可: 1. 临时对象 2. 无法位于赋值符号右边的对象
使用constexpr
以让编译器来检查该值是否是常量表达式,降低程序员负担。
除非是需要修改容器元素的内容,否则在使用迭代器的时候,应该使用其const
版本,也就是指向const
类型元素的指针,以避免误操作。
简单来讲就是对于枚举类型,也需要将其存放于命名空间中,以避免枚举中元素对外部标识符的污染。
在 c 中,typedef
是我经常使用的别名语法。但在 cpp
中,using
才是更好的选择。
理解了 auto
的推导原则后,就需要认识到使用
auto
所带来的便利性和缺陷,才能正确的使用它。
在 c 中,通常使用NULL
表示一个空指针,但是在 cpp
中有更优的nullptr
可供选择。
理解 cpp 是如何进行类型推导的,这样在使用时才不会踩太多坑……
这里的资源主要是:内存、文件描述符、互斥锁、数据库连接、socket 等,一旦不使用它们,都要归还给系统。
传统指针具有以下缺陷: 1.
单从一个指针的声明,无法判定它是指向一个对象还是指向一个包含该对象的数组
2.
单从一个指针的声明,无法判定当不使用该指针时,是否需要释放它所指向对象所占用的资源
3.
当需要释放指针所指向对象的资源时,并不能明确的知道是该使用delete
,还是使用其它专有的释放函数
4.
当需要使用delete
释放资源时,到底是使用delete
还是delete[]
,这需要小心使用,否则会造成内存泄漏或未定义行为
5. 当确定了释放机制时,也有可能写代码时一不小心,就造成了 double free 6.
当释放一个资源时,有可能还有其它指针(Dangling
pointers)指向该资源,从而导致很多很难查的 BUG
使用智能指针变能够最大化的避免以上问题。