17,对象模型:关于vptr(vitrual Pointer)和vtbl(virtual Table)

当存在虚函数就会出现虚指针vptr指向虚函数所在位置vtbl

将vptr实现vtbl内容翻译为C:

(*p->vptr)n;

(* p->vptr[n])(p);

动态绑定: 虚机制

1,指针

2,向上转型保证安全

3,调用的是虚函数

18, this指针

[Template Method]

This->Serialize()实现:

(*(this->vptr)[n])(this) -动态绑定

这里的n依旧没有得到解释.

19, 动态绑定

向上转型 : 指针实现

如 B继承A

B b;

A a = (A)b;

a.vfunc1(); 此时,是静态绑定!! 调用的是A类的vfunc1()

A* pa = new B;

pa->vfunc1(); 这里必须是动态绑定啊!这里是指针.

pa = &b;

pa->vfunc1(); 这里依旧是动态绑定.

20,const

void function() const { return data;}

const一般放在成员函数后头,不放在全局函数后头.

在成员函数后面加const是属于签名, 就是当两个成员函数传参相同,那么加不加const也会被区分成两个函数.

那这里如何区分调用情况呢?

在内存共享的情况下, 要考虑内容被更改时所产生的问题.

class template::std::basic_string<..>有如下成员函数:

charT operator[] (int n) const

{ //不必考虑COW}

reference operator[] (int n)

{ //必须考虑COW }

COW: Copy on write

所以这个类里面, 当定义的是常量对象的时候,就会被强制调用const成员函数, 当定义的不是常量对象,那么就会调用非const成员函数.



那么这里,当是非常量对象时, 也可以const成员函数呀!

规则:

当成员函数的const和non-const版本都存在<>时, const对象只能调用const版本, non-const对象只能调用non-const版本.

21, 关于New , Delete

new对象的流程不能更改,但是实现过程中的函数可以被更改.

operator new

operator delete

22, 重载::operator new, ::operator new[],::operator delete ,::operator delete[]

在全局当中:

注意: 如果你重载了全局的操作符, 所以要额外小心.

这些重载不可以被声明在一个namespace中.

//这里的函数是编译器去调用, 所以size是编译器给出.

void* operator new( size_t size )

{ return malloc(size);}

void* operator new[]( size_t size )

{ return malloc(size);}

void* operator delete(void* ptr )

{ free(ptr);}

void* operator delete[](void* ptr )

{ free(ptr);}

重载 member new , delete

在class里面重载new, delete

class foo{

public:

void* operator new(size_t size);

void operator delete(void *, size_t size); //size为可选

…….

};

那么你在:

foo *a = new foo;

delete a;

就会调用上面重载的函数.

new[] , delete[] 也如此.

23, 实例

当类中重载了new , delete , 而又想调用全局的new , delete

可以这样写:

::delete a;

string类内其实是一个指针.

当创建一个数组的时候, 内存当中就会多分配一个指针,该指针用于保存当前数组个数.

24, 重载 new(), delete() 示例

允许重载成员函数new(….) 其中参数中,必须有第一个且第一个必须是size_t size. 其余参数以new所指定的placement argument为初值.

Foo* p = new(300,’c’)Foo; //这里是三个参数

我们也可以重载类成员函数 operator delete() ,写出多个版本. 但他们绝不会被 通常所使用的delete调用.只有当new所调用的ctor抛出 异常,才会调用这些重载版的operator delete(). 它们只能这样被调用,主要用来归还未能完全创建成功的对象所占用的内存.

25, Basic_String使用new(extra)扩充申请量

Basic_String在重载new()过后,传递了一个extra参数, 用于后台自动多申请extra空间。

C++面向对象高级编程(下)第二周-Geekband的更多相关文章

  1. C++面向对象高级编程(五)类与类之间的关系

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming   OOP面向对象编 ...

  2. 20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算

    20165325 2017-2018-2 <Java程序设计>结对编程_第二周:四则运算 一.码云链接 FAO项目的码云链接; 1.Git提交日志已经实现一个功能/一个bug修复的注释说明 ...

  3. C++面向对象高级编程(三)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...

  4. C++面向对象高级编程(一)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...

  5. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  6. 20165205 2017-2018-2《Java程序设计》结对编程一 第二周总结

    20165205 2017-2018-2<Java程序设计>结对编程一 第二周总结 设计思路 编写主类Arithmetic4 编写ArithmeticFunc类来实现计算,其中包括:加.减 ...

  7. C++面向对象高级编程(九)Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  8. C++面向对象高级编程(八)模板

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...

  9. C++面向对象高级编程(七)point-like classes和function-like classes

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...

  10. C++面向对象高级编程(六)转换函数与non-explicit one argument ctor

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...

随机推荐

  1. 关于 第三方接口支付的时候 采用post提交的方式,有两种 一种是通过 curl来进行,一种是通过js当页面加载完后跳转

    这是第一种.通过javascript页面加载完后,对表单采用 post方式提交给 第三方接口----- echo <<<_END<!DOCTYPE html PUBLIC &q ...

  2. Java 集群高可用监控(结合阿里SLB)脚本

    欢迎点评,大家一起来优化 计划思路: 只有在mysql slave java 进程状态都正常的情况下才允许nginx 运行, 否则就干掉它, 负载用的是阿里的SLB #bin/bash #邮件函数  ...

  3. QQ空间删除日志

    按下F12,贴上如下代码 var delay = 2000; function del() { document.querySelector(".app_canvas_frame" ...

  4. Perl 标量

    Perl 标量 标量是一个简单的数据单元. 标量可以是一个整数,浮点数,字符,字符串,段落或者一个完整的网页. 以下实例演示了标量的简单应用: 实例 #!/usr/bin/perl $age = 20 ...

  5. 单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件)

    webrtc的音频处理模块分为降噪ns和nsx,回音消除aec,回声控制acem,音频增益agc,静音检测部分.另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到 ...

  6. csp-s模拟测试89

    csp-s模拟测试89 $T1$想了一会儿没什么思路,一看$T2$  $1e18$当场自闭打完暴力就弃了,$T3$看完题感觉要求$lca$和$dep$,手玩了一下样例发现$lca$很显然,$dep$貌 ...

  7. csv文件格式

    弱渣今天第一次读Kaggle入门文章,知道train data,test data以及提供的result文件大都是以csv文件格式给出的. csv,全称 Comma-Separated Values, ...

  8. JS 拷贝传值和引用传值

    1.拷贝传值:基本数据类型都是“拷贝传值”. 拷贝传值,就是将一个变量的值“拷贝”一份,传给了另一个变量. 拷贝传值中,两个变量之间没有任何联系,修改其中一个变量的值,另一个不会改变. 这两个变量之间 ...

  9. STL容器set用法以及codeforces 685B

    以前没怎么用过set,然后挂训练赛的时候发现set的妙用,结合网上用法一边学一边写. 首先set是一种容器,可以跟其他STL容器一样用 set<int > s 来定义, 它包含在STL头文 ...

  10. echars前端处理数据、pyechars后端处理数据

    echars -- 后端给数据,前端根据数据做渲染 - echarts:https://www.echartsjs.com/zh/index.htmlhtml文件 <!DOCTYPE html& ...