c++11新特性三大主题
1数量不定的模板参数
typename...表示有一包,这一包有很多类
typename&... 引用 至于为什么&在中间,这是语法规定
下图的print函数参数是分为一个和一包,每次递归把参数的第一个打印出来,打到最后没有参数就定义一个重载一个无参函数。
sizeof...(args)可以抓出一包有几个。
2 auto 是一个语法糖不是一个类,只是为了方便而已(有的名字太长),不能像第三个框框那样写(ite不是对象)。
3 for形式,也是个语法糖 如下:把容器中的数据遍历赋值给变量 (可以传值或引用)
4从内存的角度讨论引用本质:
const是函数签名的一部分,下面的例子如果把其中一个const去掉就能同时存在没有二义性了,这与我第一篇的const complex c1(2,1);cout<<c1.real(); 的错误一样
继承关系下构造和析构的关系 红色是系统帮你写的
5 复合关系下构造和析构的关系
这里继承和复合之间构造和析构的顺序没有规定,侯老师所用编译器是下图的顺序,其他编译器可能顺序不同
6 从内存的角度看虚函数本质 :vptr (virtual pointer)和vtbl(vitual table)只要用了一个虚函数,就多了根vptr指针,子类继承父类不止继承了数据,也继承了函数,只不过函数无法在内存上说明大小,所以子类继承的是函数调用权。所以如果父类有虚函数,子类一定也有虚函数,即一定有指针vptr。vptr指向只含虚函数的vtbl,和普通函数没有关系,bc重写了vfunc1(只有带vitual才算重写),下图指针关系实现了动态绑定(动态绑定有三个条件1必须通过指针调用,2指针是向上造型,即up cast(public继承时,将子类的对象当做是父类对象来看待使用,学生是人的子类,那么学生张三肯定是人),因为向上造型是安全的,从 3调用虚函数 动态绑定调用的函数不一定,要看p(下图灰色方框里指向a,b,c的指针)指的是什么),用c语言静态绑定(call xxx,汇编中的调用,调用的是一定的地址)实现就如灰色方框里所写。
应用:
子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数。
子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。
子类和父类参数不同,函数名相同,有virtual关键字,则不存在多态性,子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。
子类和父类返回值不同,参数相同,函数名相同,有virtual关键字,则编译出错error C2555编译器不允许函数名参数相同返回值不同的函数重载。