美文网首页
GeekBand C++面向对象高级编程(下) 第二周学习笔记

GeekBand C++面向对象高级编程(下) 第二周学习笔记

作者: 淡定若然 | 来源:发表于2017-02-20 21:05 被阅读0次

本周学习内容回顾

对象模型

vptr虚函数指针

若类对象中含有虚函数,则在对象模型中会存在一根虚函数指针

vtbl虚函数表

虚函数指针指向一块内存,称为虚表

虚表的内容是一段地址,指向该类对象在实现多态过程中虚函数实际绑定的函数

this

模板方法

通过this指针调用虚函数指针指向虚表中实际对应的虚函数

动态绑定

动态绑定的实现需要满足三个条件

1.使用指针调用

2.存在向上转型

3.调用的是虚函数

const漫谈

const对象可以调用const成员函数

const对象不可以调用non-const成员函数

non-const对象可以调用const成员函数

non-const对象可以调用non-const成员函数

const String str("hello world");

str.print();

如果当初设计String::print()时未指明const,那么上行便是经由const对象调用non-const成员函数,会出错,绝非我们想要看到的结果。

当成员函数的const和non-const版本同时存在时:

const对象只会调用const版本

non-const对象只会调用non-const版本

new和delete

全局的new/delete

如果重载全局::operator new(), ::operator new[]new()

::operator delete(), ::operator delete[]()

将影响整个项目

对于已经有重载作为类成员的new/delete

使用::new ::new[] ... 即可强制使用全局版本的函数

作为类成员的new/delete

对于类成员 如果没有定义成员new/delete

则会调用全局的new/delete

对于已经定义了成员new/delete的类

可以使用::前缀强制调用全局new/delete

placement new()

basic_string使用的new(extra)扩充申请量

template<class chatT, class traits, class Allocator>

inline void* basic_string<charT, traits, Allocator>::Rep::operator new(size_t s, size_t extra)

{

        return Allocator::allocate(s + extra * sizeof(charT));

}

对作业的思考

执行结果第一页 执行结果第二页

1.new出来的偏移量与上节课所得size并不完全匹配。

2.重载全局new和delete之后 对于fruit类 没有定义new/delete 使用new()...之后会自动调用全局的new/delete。

3.第一次编译时可能会出现重定义等错误提示,清理后重新编译可以成功。

相关文章

网友评论

      本文标题:GeekBand C++面向对象高级编程(下) 第二周学习笔记

      本文链接:https://www.haomeiwen.com/subject/rigewttx.html