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

本周学习内容回顾

对象模型

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

inline void* basic_string::Rep::operator new(size_t s, size_t extra)

{

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

}

对作业的思考


GeekBand C++面向对象高级编程(下) 第二周学习笔记_第1张图片
执行结果第一页
GeekBand C++面向对象高级编程(下) 第二周学习笔记_第2张图片
执行结果第二页

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

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

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

你可能感兴趣的:(GeekBand C++面向对象高级编程(下) 第二周学习笔记)