(Boolan) 面向对象高级编程(下)第五周笔记

2017-08-16  本文已影响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));
}

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇下一篇

猜你喜欢

热点阅读