侯捷老师c++课程笔记 (面向对象高级编程6)

本文解析C++11中的三大核心特性:可变数量模板参数、auto简化语法和for-each容器遍历。探讨了模板参数的灵活性、auto作为语法糖的便捷性以及for形式在迭代中的高效用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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编译器不允许函数名参数相同返回值不同的函数重载。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值