C++面向对象高级编程(下)第二周-Geekband
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的更多相关文章
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
- 20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算
20165325 2017-2018-2 <Java程序设计>结对编程_第二周:四则运算 一.码云链接 FAO项目的码云链接; 1.Git提交日志已经实现一个功能/一个bug修复的注释说明 ...
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
- C++面向对象高级编程(一)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要: 知识点1 构造函数与析构函数 知识点2 参数与返回值 知识点3 const 知识点4 函数重载(要与重写区分开) 知识点5 友元 先以C ...
- Java面向对象 网络编程 下
Java面向对象 网络编程 下 知识概要: (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端: ...
- 20165205 2017-2018-2《Java程序设计》结对编程一 第二周总结
20165205 2017-2018-2<Java程序设计>结对编程一 第二周总结 设计思路 编写主类Arithmetic4 编写ArithmeticFunc类来实现计算,其中包括:加.减 ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...
- C++面向对象高级编程(七)point-like classes和function-like classes
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
随机推荐
- Python全栈开发:django网络框架(二)
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- 前端常用的库和实用技术之JavaScript多线程
多线程概念: 多线程是指从软件或硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在 同一时间执行多于一个线程,进而提升整理处理性能.具有这种能力的系统包括对称多处理机,多核心 ...
- arc098E Range Minimum Queries
题意:给你一个n个数的数组,每次能够选取连续的长度为K的子序列,取出其中任意一个最小元素. 一共操作Q次.问取出的元素中Max-Min最小是多少? 标程: #include<bits/stdc+ ...
- tp5 mkdir() 没有权限
- python的起源及基本语句
一.Python的起源 Python是吉多范罗苏姆于1989年的圣诞节期间在阿姆斯特丹进行编写的,于1991年编写完成,Python是一门解释型弱类型的编程语言. Python在多个领域中都有应用,比 ...
- Windows平台编译libevent
使用VisualStudio来编译,我的电脑上安装的是VS2013.1.在开始菜单项里面(或者在VS安装路径中)打开Developer Command Prompt for VS2013.exe2.在 ...
- SpringCloud学习笔记(九):SpringCloud Config 分布式配置中心
概述 分布式系统面临的-配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的.动 ...
- 阿里云CentOs7上安装Tomcat
一.下载安装tomcat8 cd /usr/ #创建tomcat目录 mkdir tomcat #从网上download 压缩包 wget tomcat8 url #解压 tar -zxvf apac ...
- 开发笔记-19/10/28 -SpringBoot @Value 获取配置参数
1. 在application.properties 定义参数 role.taskEvent :参数名称 4:值 ## ---------------------任务角色--------------- ...
- echars前端处理数据、pyechars后端处理数据
echars -- 后端给数据,前端根据数据做渲染 - echarts:https://www.echartsjs.com/zh/index.htmlhtml文件 <!DOCTYPE html& ...