1. 空类的sizeof值
- 对于无成员函数,无成员变量的空类,其sizeof值为1. 虽然没有成员占内存,但必须在内存中占一定空间,由编译器决定(VS)。
- 在空类中添加函数,其sizeof还是1。因为实例中不储存类函数相关内容,只通过函数地址调用。
- 若有虚函数,则会为类生成虚函数表。在实例中添加指向虚函数表的指针。因此占一个指针的空间。
2. 拷贝构造函数
拷贝构造函数的形参不能是同类对象,要加const &
。
因为在形参传值的过程中,会有复制实例的过程,递归调用拷贝构造函数,这样会发出无限递归,导致栈溢出。
A(A a) {}; // wrong
A(const A& a) {}; // right
3. 单例模式
- 使用共有方法获取实例
- 成员变量静态,初始未null, get里判断,为null初始化
- 加同步锁,在初始化外使用 // 放置多线程时初始化多个实例
- 同步锁外再次判断是否为null // 放置多次用锁降低效率
4. lambda函数
又称匿名函数。因为不作为一个函数单独出现,没有名字。
如:
auto getAbd=[](float n)-> int {return abs(n);}(-3.5);
// 3.5
函数功能:返回int
类型的绝对值。
以[]
为标识符;后接()
为形参;后接-> int
可选,为指定返回值类型,若不指定,则自动推断,这里存在一个强制转换。所以一般最前用auto
;后接{}
为函数体;后接()
为实参。
5. 智能指针
用于管理内存,能够自动释放内存,避免内存泄漏。
是一个模板,创建时需要声明指针类型。
shared_ptr
:多个指针指向一个对象unique_ptr
:一个指针指向一个对象
使用make_shared
在动态内存中分配一个对象并初始化,返回动态指针。