C++OO部分知识小结(1)

C++ 网络库 cpp-netlib的简单使用 示例代码 (C++11, cpp-netlib版本:0.12.0) 需要链接库文件 target_link_libraries(app boost_system network-uri cppnetlib-server-parsers ) #include <network/uri.hpp> #include <nlohmann/json.hpp... 阅读详情

1. 宏比函数更有效率:

void print(const Point3d *pd){

  printf("(%g,%g,%g)",pd.x,pd.y,pd.z);
}

可以替换为更高效的宏:

#define Point3d_print(pd) \   
  printf("(%g,%g,%g)",pd.x,pd.y,pd.z);

注意:宏中的\表示把下一行拼接在当前行后面。

2. 相比于C语言,C++在布局(加上封装后的布局,通常与布局成本联系)以及存取时间上的主要额外负担来自于virtual引起的,包括:

virtual function机制:用以支持有效率的“执行期绑定(runtime binding)”,也称为“动态绑定”,实现多态(Polymorphism), 多态性是将接口与实现进行分离。

virtual base class:用以实现"多次出现在继承体系中的base class,有且只有一个单一而被共享的实例",即在派生类在继承多个基类时,具有相同【根基类】的基类全是虚继承,防止该【根基类】的实例在继承体系中多次出现。如代码:

class base{..}

class other{...}

class childA:public base{..}

class C:vistual public base, vistual public childA, public other
{
..
}

  1. 派生类在构造函数进行构造的时候,会先调用基类的构造函数完成基类部分的构造后,才看是自身的构造。因此,在多继承中,位于最底端的派生类,在构造的时候很有可能会多次调用【根基类】,此时,虚继承很好的解决了这个问题,即【根基类】相当于只被构造一次。
  2. 这里的 virtual是共享的意思。

3. 三种OO模型:

(1)简单对象模型(ASimple Object Model)

在这个简单模型中,每个object都是一系列的slot(插槽),每个slot指向一个成员,每一个数据成员和成员函数都有自己的slot.在这个模型下,members不放在object里,只有指向member的指针才放在object中,这么做可以避免“member有不同类型,因而需要不同存储空间”所招致的问题。Object中的member是以slot的索引值来寻址的,本例子中_x的索引是6,_point_count的索引是7.这样,一个 class object的大小很容易计算出来,即指针大小*class中声明的member数。

虽然这个模型没用实际应用,但索引或slot个数的观念,被应用到C++的“指向成员的指针”的观念中。

(2)表格驱动对象模型(A Table-drivern Object Model)

为了对所有的classes的所有objects都有一致的表达,另一种对象模型是把所有与members相关的信息抽出来,放在data member table和member function table中, class objects本身则内含指向这2个表的指针。member function table是一些列的slots,每一个slot指出一个member function; data member table则直接持有data本身

虽然这个模型也未被采用到C++编译器中,但member function table这个观念却成为支持virtual function的一个有力方案。

(3) C++对象模型

Stroustrup设计的最初C++模型是从简单对象模型派生而来,并对内存和存取时间做了优化。在此模型中,非静态数据成员被放置于每个class object之内,静态数据成员被存放在个别class object 之外。静态和非静态成员函数也被放在个别class object之外。Virtual function以两个步骤支持之:

1. 每一个class产生一堆指向virtual  function的指针,放在表格中,这个表格被称为virtual table (vtbl);

2. 每一个class object被安插一个指针,指向相关的virtual table,该指针被称为vptr。 vptr的设定和重置都由每一个class的构造,析构和copy assignment运算符自动完成。每一个class关联的type_info object(用以支持runtime type identification, RTTI)也经由virtual table被指出来,通常放在表格的第一个slot。

一种class只产生一个 virtual table(vtbl),该类的所有对象都会被(编译器或系统)安插一个指向该table的指针vptr。

这个模型的主要优点是空间和存取效率,缺点是一旦class object的非静态数据成员有所修改(增,删,改),那么应用程序代码需要重新编译。关于此点,前面表格驱动中的双表格模型可以提供较大弹性,因为它多了一层间接性,因此也付出了空间和执行效率的代价。

4. struct与class

C:struct

C++ : class

在cfront(第一个C++实现品,有Lippman完成)之中,上述两个关键词在语义分析器(parser)中是以共享的“AGGR”替换的。C++中继续保留struct,完全是为了兼容C。但在C++中,除了struct默认成员为public而class默认为private外,两者没有任何区别,可以交叉继承,如; 

struct s{..};
class c{..};
class b: public s{...}; 
struct s2: public c{...}; 

此外,struct在下面场景及其适用:“当要传递一个复杂的class object的部分或者全部” 到某个C函数去时,struct声明可以将数据封装起来,并保证拥有与C兼容的空间布局。

在C++中,struct定义的成员默认是public,但可以像class一样,分public,protected和private,可同时包含数据成员和成员函数。而在 C里,结构体都只有数据成员,而没有函数成员。

5. 在OO Paradigm之中,继承体系中的某个未知实例,他的类型虽然有所界定,但却有无穷可能,原则上,被指定的object的真实的类型在每一个特定执行点之前,是无法解析的。在C++中,只有通过pointers指针和reference引用的操作才能完成。相反,在ADT paradigm中,程序员处理的是一个拥有固定而单一类型的实例,编译时就能确定好。

C++支持三种programming paradigm:

程序模型procedural model

抽象数据类型模型 abstract data type model,ADT

面向对象模型object-oriented model

参考文献:

[1] Stanley B.lippman. inside the C++ Object Model(深度探索C++对象模式)[M].电子工业出版社,2012.

 

【RabbitMQ C++】AMQP-CPP实战:从零构建高效消息队列系统 本文详细介绍了如何使用C++和AMQP-CPP库从零构建高效的RabbitMQ消息队列系统。内容涵盖环境搭建、核心概念解析,并通过实战代码示例演示了如何编写生产者和消费者程序,实现消息的发布与订阅。文章重点讲解了如何与libev事件循环集成,以构建高性能、可靠的异步通信组件,为C++分布式系统开发提供了一套完整的解决方案。 阅读详情

相关推荐

C++ log4cpp的使用

C++ log4cpp使用安装需要了解的四个部分(基本的) log4cpp官网 这里整理了需要使用到的基本内容 安装 从官网下载最新的库文件 下载地址 下载的文件名格式为 log4cpp-x.y.z.tar.gz 以下内容均在Linux中完成 版本信息 Linux version 5.3.0-46-generic (buildd@lcy01-amd64-013) (gcc version 7.5...

Zzzz的博客 787

C语言程序结构

C语言程序的注意事项 函数总是从main()函数开始执行的 程序中要求计算机的操作是由函数中的c语句完成的 每个数据声明语句的最后必须有一个分号 C语言本身不提供输入输出语句 程序应当包括注释 接下来就是逐条分析 1、在预处理指令中主要需要注意的是#include&amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;和#include&amp;amp;quot;stdio.h&amp;amp;quot;是有区别的,笼统的说就是被包含与包含的关系。

繁华,一场空 274

C++OO思想

C++语言简介 C++是一种语言,仅仅是它的语法、特性、标准类库就已经是一门非常高深的课程,所以在开始学习的时候,必须先要打好基础。 在市面上有很多Visual C++的书,虽然其中可能会花1-2章来介绍C++的基本特性,但是那绝对不会让你入门。 C++的特点与OO思想 C语言有一个优点,即它的速度可以很快。写出来的程序可以很精练、简单、小巧,不用为了解决某个问题环绕太平洋一大圈。 但如果将C和C...

希望我的博客,能帮上你解决学习中工作中所遇到的问题 695

C++与OO思想介绍

C++时一种语言,仅仅是它的语法,特性,标准类库就已经时一门非常高深的课程,必须先打好基础在面对对象的思想中,任何事物都可以被看作一个对象。一个在复杂的模型结构都是由千千万万个对象。放眼大局,面对对象来看问题,每个对象都是一个完整的独立的个体,由相关的属性和行为组合,与外界无关。

Nenu073028的博客 318

Maya vray 3S皮肤材质球设置与材质节点连接

Maya vray 3S皮肤材质球设置与材质节点连接

WETQETF的博客 2697

保姆级教程:Windows下用GDC-Client下载TCGA数据,从环境变量配置到成功下载

本文提供Windows平台下使用GDC-Client下载TCGA数据的完整教程,从环境变量配置到成功下载。详细介绍了GDC-Client工具的安装、系统环境变量设置、配置文件优化以及数据下载实战技巧,帮助生物信息学研究者高效获取TCGA数据库中的癌症基因组数据。

weixin_42520025的博客 403

OO设计原则 -- OO设计的原则及设计过程的全面总结

前面发表了5篇OO设计原则的文章,在这里我将这个5个原则如何在我们设计过程进行应用进行一下总结, 这是我通过阅读和学习很多博文和资料后进行的一个梳理和总结,仅供大家来参考。 一.OO(面向对象)的设计基础 面向对象(OO):就是基于对象概念,以对象为中心,以类和继承为构造机

亿言 2万+

linux下autocad完美替代品bricscad的安装运行

前言 在Linux平台下,能完美兼容.dwg文件的软件并不多。 虽然国产的中望和浩辰为适配uos操作系统,近期都推出了linux版本,但目前好像还没有对应的破姐流出。(如果有的话请私信我或留下评论) 然而有了这一款源自比利时的软件——bricscad,linux下查看和编辑.dwg文件再也不是噩梦了! 安装pj 资源链接:https://pan.baidu.com/s/1dC7zarlqwuO5fa4CBL_KGQ 提取码:24j6 1.下载对应的压缩包,解压并安装其中对应的deb或rpm软件包。 2.在C

weixin_35259117的博客 4484

C++——oo的魅力之多态

本篇博客详细讲述了c++多态相关的知识,首先是多态的定义和概念,然后讲述了多态构成的条件以及多态的一些特殊情况,并且讲述了c++11的两个关键字,然后说明了抽象类和纯虚函数的含义,最后通过vs的监视和内存说明了多态是如何通过虚表实现的,以及多继承的虚表,之后带大家简单看了菱形虚拟继承多态的复杂,留下了一点小疑问,最后又列举出了一系列有关多态的小细节。

weixin_72883322的博客 289

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 602

基于Lumerical的1550 nm InGaAs/InP与InGaAs/InAlAs APD设计与功率饱和度优化

摘要 本研究利用Ansys Lumerical软件对1550 nm激光雷达应用的InGaAs/InP和InGaAs/InAlAs雪崩光电二极管(APD)进行仿真设计与优化。通过FDTD光学仿真获取光吸收分布,结合CHARGE模块的电学仿真分析暗电流、光电流及雪崩增益特性。重点研究了两种材料体系的性能差异,并针对近距离强反射导致的功率饱和问题提出结构优化方案。仿真结果表明,InGaAs/InAlAs APD具有更优的过量噪声特性,而优化的电荷层设计可显著提升器件的功率饱和阈值。研究提供了完整的仿真流程与代码实

huanghm88的专栏 97

C++ 学习笔记一 OO思想

1.什么是OO思想: 在面向对象的思想中,任何事物都可被看成一个对象。一个再复杂的模型结构都是由千千万万个对象组成的。这是根本思想。 而每个对象,抽象起来最终可分为两个要素:属性(特征)和方法(行为)。 在面向对象编程中,程序员不再面对一个个函数和变量,而是要放眼大局,面对一个个对象来看问题。   2.OO思想的特点(来源于实际生活): (1) 封装: 封装意味着把对象的属性和方法结...

u012122838的博客 722

用 DCL 编写 DEFINE ROLE:把 ABAP CDS 的访问控制做对、做实、做漂亮

摘要: 本文详细讲解如何在ABAP CDS中使用DCL(数据控制语言)实现行级授权,确保业务数据安全。核心要点包括: DCL原理:通过DEFINE ROLE将访问条件绑定到CDS实体,自动附加到查询条件(类似隐式WHERE),保障授权一致性。 关键语法: 必需注解@MappingRole: true声明映射角色。 ASPECT pfcg_auth关联PFCG权限对象,动态控制访问。 注解@AccessControl.authorizationCheck定义授权检查策略(如#CHECK启用强制控制)。 优先级

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 166

1. C++语言与OO思想

1.

dugudaibo的博客 939

漏洞挖掘之工具配置

本文主要讲解burp工具的插件安装。

qq_64775230的博客 3275

HTOL集成电路老化测试学习总结-20250510

电子元器件的可靠性在产品开发中至关重要,尤其是在微电子技术迅速发展的今天。电子元器件的失效率通常遵循“浴盆曲线”,分为早期失效期、可使用期和老化期。为了评估芯片的可靠性,常采用高温操作寿命测试(HTOL),通过高温和高压加速芯片老化,以筛选出早期失效的芯片并评估其长期可靠性。HTOL测试中,芯片在高温下运行并监控其性能变化,通过阿伦尼乌斯公式计算加速因子,预测芯片的失效率和寿命。此外,Burn-in测试用于加速芯片老化,提前发现并剔除不合格产品,而早期失效率测试(ELFR)则用于评估产品初期使用阶段的可靠性

歌颂苦难的行为是无耻的; 2103

C++与OO思想的联系、输入输出操作

C++笔记第一天

qq_48917474的博客 575

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OO思维(零) 写在前面

我想在正题之前简单的讲几句关于这篇文章的事。最近看了不少关于OO的文章,大部分给人的感觉还是太理论,太教条,而且非常形式化。我写这篇文章的时候特别注意到这个问题, 最好尽量的不要把它讲的过于理论化。这里主要说的是我个人对OO的一些理解和看法。 认为学好C++学好JAVA就自然而然拥有了OO思维。难道仅靠些语法就能设计出高质量的OO模型了?认为面向过程已经被淘汰了,使用OO写出来软件就一定具有更高的

nonocast 2298

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

OO,OO以后,及其极限

1、什么是软件开发?  软件开发的过程就是人们使用各种计算机语言将人们关心的现实世界映射到计算机世界的过程;   现在的计算机的数学理论基础是由计算机的开山鼻祖,大名鼎鼎的图灵于1937年提出的图灵机模型。 随后不到十年,电子计算机就诞生了(1945)。(埃尼亚克)   我们都知道,它当时的主要任务之一就是用于导弹弹道轨迹的计算。当时的软件开发(如果可以称之为软件开发的话)与现在的...

dechen6073的博客 3453

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++快速入门——1.C++语言与OO思想

1.C++与OO思想

Zhaosw2009的博客 382

CPP-Summit-2020 学习:When OO is not “OO”

原文:很多人认为: 在 C++ 里确实:作者给出一个“为了演讲简化”的定义:多态本质是: 同一接口,不同实现 同一接口,不同实现 同一接口,不同实现 或者更形式化一点: f(x)的行为取决于x的动态类型 f(x) 的行为取决于 x 的动态类型 f(x)的行为取决于x的动态类型 举例: 解释 Animal 是抽象基类 speak 是虚函数 Dog / Cat 提供不同实现 调用: 关键在这里: 真正调用哪个函数? 取决于 a 的动态类型。这是 OO 里经典的: 这代表: 这就是子类型关系(Subtype

虾球 721

【C++】【学习笔记】【001】CPP语言与OO思想介绍

什么是OO思想 C++有个绝对的优势,就是针对不同的对象去做实例化,这就是所谓的OO思想。 对于每个对象,抽象起来最终可以分为两个要素:属性和行为。 OO思想的特点 1、封装:把对象的属性和方法结合成一个独立的系统单位,并尽可能影藏对象的内部细节; 2、抽象:其过程是对具体问题进行概括的过程,是对一类公共问题进行统一描述的过程; 3、继承:子类对象拥有与其基类相同的全部属性和方

木名的专栏 606

OO设计原则的cpp举例

OO设计原则的cpp举例

SnailElderBro的博客 790

C++日志框架log4cpp

C++日志框架log4cpp 使用说明详见log4cpp官网。 windows平台编译log4cpp库详见连接:https://blog.youkuaiyun.com/qq_35682844/article/details/87880923 附件中包括x64 release的库文件。 编写log4cpp.properties配置文件,如下文: #-------定义rootCategory的属性------- #指定rootCategory的log优先级是ERROR,其Appenders有两个,分别是cons

quietbxj的博客 1183

【Linux C++】log4cpp日志库的安装和使用详解

log4cpp是一个开源的 C++ 日志库,灵感来源于 Java 的log4j。它提供了灵活的日志记录功能,可以帮助开发者在 C++ 应用程序中记录、管理和格式化日志信息。log4cpp支持多种日志记录策略和输出目标,可以满足各种不同的需求。

qq_42037383的博客 2089

【c++中间件】RabbitMQ介绍 && AMQP-CPP库的使用 && 二次封装

RabbitMQ 安装与 C++ 客户端开发指南 本文介绍了 RabbitMQ 消息队列服务的安装配置及 C++ 客户端开发方法。主要内容包括: RabbitMQ 服务安装 通过 apt 安装 RabbitMQ 服务 创建管理员用户并设置权限 启用 Web 管理界面(端口 15672) C++ 客户端开发 安装 AMQP-CPP 库(支持 C++17) 两种开发模式:原生 TCP 实现或使用 libev/libevent 等异步组件 RabbitMQ 核心概念 基于 AMQP 协议的通信机制 关键组件:连接

lirendada的博客 1359
上一篇: C++ 静态成员的类内初始化
下一篇: C++中派生类使用基类成员的问题
Poo_Chai
博客等级 码龄9年 178粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Poo_Chai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值