struct和union的区别
存储多个成员时,编译器会给struct中每个成员分配存储空间,struct中存在多个成员的状态信息,union多个成员共用同一块存储空间,只会存储最后一个修改成员的信息。
都是由不同类型的成员变量组成,union只存放一个被先选中的成员,struct存放所有的成员。
在赋值时,union不同成员的赋值会对其他成员进行重写,原来成员的值就不存在了,struct成员的赋值不会相互影响。
链接
空指针可以调用成员函数
空指针可以调用不使用this指针的成员函数,不能调用虚函数
因为在调用成员函数时会隐式的调用this指针当做函数参数,类的成员函数是存储在代码区上,传入空类型时如果不使用this指针则不影响函数的运行。
对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。 当程序被编译之后,此成员函数地址即已确定。当调用p->func1(); 这句话时,其实就是调用A::func1(this);而成员函数的地址在编译时就已经确定, 需要注意的是,你用空指针调用成员函数,只是让this指针指向了空,所以空指针也是可以调用普通成员函数,只不过此时的this指针指向空而已,但函数fun1函数体内并没有用到this指针,所以不会出现问题。
链接
可变模板参数原理
递归调用
通过递归函数展开参数包,需要提供一个参数包展开函数和递归终止函数,递归终止函数是用来终止递归的。
逗号表达式
逗号表达式会按顺序执行逗号前面的表达式。
链接
函数对象和函数指针
函数对象也称仿函数,是一个重载了()运算符的类对象,与普通函数调用的行为类似。
函数指针本质上是一个指针,指向函数的入口地址,可以通过函数指针进入函数入口地址调用函数。
函数对象的优点:
对象可以在内部修改而不用改动外部接口,更灵活与安全。
函数对象具备存储先前调用结果的函数成员,可以维护函数调用的状态,而不必使用全局变量或静态变量存储。
在函数对象中编译器能进行内联(编译器能内联重载的操作符代码,所以就避免了与函数调用相关的运行时问题),进一步增强了性能。
可以用过模板函数对象增加函数对象的通用性。
链接