121.构造函数不能为虚函数
122.使用指针访问虚函数时,编译器根据指针所指对象的类型决定要调用哪个函数(动态联编),而与指针本身的类型无关
123.引用访问虚函数,与指针访问虚函数类似,不同引用一经声明后,引用变量本身无论如何改变,其调用的函数就不会再改变,始终指向其开始定义时的函数
124.在类的成员函数中访问虚函数,采用动态联编,需要this指针。
125.构造函数和析构函数是特殊的成员函数,在其中访问虚函数时,C++采用静态联编,即在构造函数或析构函数内,即使是使用“this->虚函数名”的形式来调用,编译器仍将其解释为静态联编的“本类名::虚函数名”。即它们所调用的虚函数是自己类中定义的函数,如果在自己的类中没有实现该函数,则调用的是基类中的虚函数。但绝不会调用任何在派生类中重定义的虚函数。
126.虚函数的实现,虚指针(vptr)维护了一张表(虚函数表)里面存放了虚函数的地址(虚函数的代码真正位于的跟普通函数一样,也是代码区),虚函数覆盖,即覆盖虚函数表
127.纯虚函数,在基类中只声明不实现,实现留给子类(声明格式:virtual void disp() = 0)
128.一个类可以包含多个纯虚函数,只要类中含有一个纯虚函数,该类便为抽象类。一个抽象类,只能作为基类去派生新类,不能创建抽象类的对象(如:A为抽象类
A a; 非法),但可以声明一个指向抽象类的指针
129.和普通的虚函数不同,在派生类中一般要对基类中虚函数进行重定义,或者在派生类中再次将该虚函数声明为纯虚函数。这说明,抽象类的派生类也可以是抽象类,只有在派生类中给出了基类中所有纯虚函数的实现时,该派生类便不再是抽象类。和纯虚函数一样,抽象类只起到提供统一接口的作用。
130.虚析构函数,如果类中定义了虚函数,析构函数也应被定义为虚析构函数,特别是当类中有申请动态内存。需要清理和释放的时候
131. 虚函数调用规则。1.如果有一个基类的指针指向派生类的对象,并且想通过该指针delete派生类对象,系统将只会执行基类的析构函数,而不会执行派生类的析构函数。为避免这种情况的发生,往往把基类的析构函数声明为虚的,此时,系统将先执行派生类对象的析构函数,然后再执行基类的析构函数。2.如果基类的析构函数声明为虚的,派生类的析构函数也将自动成为虚析构函数,无论派生类析构函数声明中是否加virtual关键字。
132.多基派生的二义性( 0726 ambiguous_virtual.cc)解决方法用作用域
133.function(模板类),可以包装其他任意的函数对象,格式为function<返回值,(参数类型)>,其中参数类型可以有很多个,function最大用处在于函数回调(类似于函数指针)。头文件<functional>
134.bind,
1.bind
是这样一种机制,它可以预先把指定
可调用实体
的某些参数
绑定
到已有的变量,产生一个新的可调用实体。
2.绑定的
参数的个数
不受限制
。3.绑定的具体哪些参数也不受限制,由用户指定。
4
.bind
预先绑定的参数需要
传具体的变量或值
进去,是
pass-by-value(
值传递
)
的。
5.对于不事先绑定的参数,需要传
std
::placeholders
进去,从
_1
开始,依次递增。6.
bind
的返回值是可调用实体,可以直接赋给
std
::function
对象(绑定的顺序,跟数字有关,如bind(func, _2,_1),那么_1,其实是绑定在第一个参数上,下面传参的时候,如(10,20),第二个参数的值其实为10,第一个为20)
135.auto(C++11)能自动识别变量类型
136.占位符是_数字,数字跟剩余参数数目有关,如果剩余1个参数就是1,剩余2个就是2,以此类推。
137.对于相同的功能,只是变量类型不同的函数,可以采用模板定义,template<typename T>
void func(T 形参名, T 形参名 ……)
138.模板也可用于结构体上,但是如果只想对结构体内部分参数有效,需要显示具体化调用,格式为:template<> 返回值 func<结构体名>(结构体名 形参名……)
139.如果在模板中,变量的类型不确定,在C++11中可以用decltype。如:
template<class T1, class T2>
void func(T1 &x, T2 & y)
{
decltype(x+y
)xpy = x + y;
}
140.如果函数返回值类型不确定在C++11中,也可以结合decltype和auto使用,这样就可以给函数指定返回类型。如:
template<class T1, class T2>
auto func(T1 X, T2 y) ->decltype(x + y)
{
return x + y;
}
141.类中也可以重载转换函数,如要将类转换为int 需要定义 operator int()
142.new也可以直接指定要使用的位置,头文件为#include<new> 格式如
int *p1; p1 = new(buffer) int[20],意思为在buffer上开辟一个为int 的20个字节的空间给p1.注意:delete不能与new定位运算符一起使用。当定位运算符new与类对象在一起使用时,释放类对象需要显示调用析构函数
143.处理异常,用try catch throw语句结合
144.在C++11标准中,引入了lambda函数。即可省略返回值,如 [](int x){return x % 3 == 0;},返回值,编译器用decltype判断,要捕获,或者使用变量,只需要将变量名填入中括号中,如[z],即访问变量z,具体可以参考这篇文章。