C++对象模型——关键词所带来的差异(第一章)

1.2    关键词所带来的差异 (A Keyword Distinction)

假设不是为了努力维护与C之间的兼容性。C++能够比方今更简单。举个样例,假设没有八种整数须要支持的话,overloaded function的解决方案将会简单得多。相同的道理。假设C++丢掉C的声明语法。就不须要推断以下这一行事实上是pf的一个函数调用操作(invocation)而不是声明:

// 不知道以下是个declaration还是invocation
// 直到看到整数常量1024才干确定
int (*pf)(1024);

而在以下这个声明中,像上面那样的"向前预览(lookahead)"甚至起不了作用:

// meta-language rule:
// pq的一个declaration,而不是invocation
int (*pq)();

当语言无法区分是一个声明还是一个表达式(expression)时,须要一个超越语言范围的规则。而该规则会将上述表达式推断为一个"声明".

相同地。假设C++并不须要支持C原有的struct。那么class的观念能够借由关键词class来支持。但令人吃惊的是,从C迁移到C++。除了效率。还有一个最常被程序猿询问的问题就是:什么时候应该在C++程序中以struct代替class?

关键词的困扰

关键词struct本身并不一定要象征其后随之声明的不论什么东西,能够使用struct取代class,但仍然声明 public、protected、private 等等存取区段。以及一个全然 public 的接口,以及 virtual functions,以及单一继承、多重继承、虚拟继承等等。

    在C++中,选择struct或class作为关键词。用以导入ADT的理由是希望代码健全。

在C所支持的struct和C++所支持的class之间,有一个观念上的重要差异。重点在于:关键词本身并不提供这样的差异,假设使用以下的定义类型,能够说这是一个class.

// struct名称(或class名称)临时省略
{
public:
    virtual void foo();
protected:
    static int object_count;
};

    其实能够它是一个struct,也能够说它是个class,这两种声明的观念上的意义取决于对"声明"本身的检验。

真正的问题并不在于全部"使用者自己定义类型"的声明是否必须使用同样的关键词,问题在于使用class或者struct关键词能否够给予"类型的内部声明"以某种承诺。

策略性正确的struct (The Politically Correct Struct)

C程序猿的巧计有时候却成为C++程序猿的陷阱。比如把单一单元的数组放在一个struct的尾端,于是每一个struct objects能够拥有可变大小的数组:

struct mumber {
    /* stuff */
    char pc[1];
};
// 从档案或标准输入装置中取得一个字符串
// 然后为struct本身和该字符串配置足够的内存
struct mumble *pmumbl = (struct mumble *)
malloc(sizeof(struct mumble) + strlen(string) + 1);
strcpy(&memble.pc, string);

假设改用class来声明,而该class是:

指定多个access sections,内含数据

从还有一个class派生而来

定义有一个或多个virtual functions

那么也许能够顺利转化。也许不行。

    C++中凡处于同一个access section的数据。必然保证以声明次序出如今内存布局其中,然而被放置在多个access sections中的数据,排列次序就不一定了。

相同的道理,base classes和derived classes的data member的布局也没有谁先谁后的强制规定。

vitual function的存在也会使前面转化的有效性成为一个问号。

假设须要一个相当复杂的C++ class的某部分数据。使它拥有C声明的那种样子。那么那一部分最好抽取出来成为一个独立的struct声明,将C与C++组合在一起的作用就是,从C struct中派生C++的部分:

struct C_Point {...};
class Point : public C_point {...}

于是C和C++两种使用方法都可获得支持:

extern void draw_line(Point, Point);
draw_line(Point(0, 0), Point(100, 100));
draw_rect(Point(0, 0), Point(100, 100));

这样的习惯使用方法现已不再被推荐,由于某些编译器在支持virtual function的机制中对于class的继承布局做了一些改变。组合(composition),而非继承,才是把C和C++结合在一起的唯一可行方法(conversion运算符提供了一个十分编译的萃取方法):

struct C_point {...};
class Point {
public:
    operator C_point() { return _c_point; }
private:
    C_point _c_point;
};

    C struct在C++中的一个合理用途。是当须要传递"一个复杂的class object的所有或部分"到某个C函数中去时,struct声明能够将数据封装起来,并保证拥有与C兼容的空间布局,然而这项保证仅仅在组合(composition)的情况下才存在。假设是"继承"而不是"组合"。编译器会决定是否应该有额外的data members被安排到base struct subobject中。

时间: 2024-11-07 16:37:53

C++对象模型——关键词所带来的差异(第一章)的相关文章

【深度探索C++对象模型】第一章 关于对象

第一章 关于对象(Object Lessons) -- 本书作者:Stanley B.Lippman 一.前言 什么是 C++ 对象模型:简单的说,就是 C++ 中面向对象的底层实现机制. 本书组织: 第 1 章,关于对象(Object Lessons),介绍 C++ 对象的基础概念,给读者一个粗略的了解. 第 2 章,构造函数语意学(The Semantics of Constructors),构造函数什么时候会被编译器合成?它给我们的程序效率带来了怎样的影响? 第 3 章,Data语意学(T

C++对象模型——关于对象(第一章)

第一章    关于对象 在C语言中,"数据"和"处理数据的操作(函数)"是分开声明的,也就是说,语言本身并没有支持"数据和函数"之间的关联性.我们把这样的程序方法成为程序性,由一组"分布在各个以功能为导向的函数中"的算法所驱动,它们处理的是共同的外部数据.举个样例,假设声明一个struct Point3d,像这样: typedef struct point3d { float x; float y; float z; } Po

JavaScript DOM编程艺术第一章:JavaScript简史

本系列的博客是由本人在阅读<JavaScript DOM编程艺术>一书过程中做的总结.前面的偏理论部分都是书中原话,觉得有必要记录下来,方便自己翻阅,也希望能为读到本博客的人提供一些帮助,所以 如果您也看过这本书,希望不要喷小的"抄袭",其实我也懒得敲这些文字也想简单粗暴地上代码,但是只有实践没有理论不容易自己理解,为避免误导,该"抄"的地方还是要"抄"的,哈哈~~ 一.JavaScript的起源 JavaScript是Netscap

Solr In Action 中文版 第一章(四、五)

1.1             功能概览1. 4 最后,让我们再按照下面的分类,快速的过一下Solr的主要功能: ·用户体验 ·数据建模 ·Solr 4的新功能 在本书中,为你的用户提供良好的搜索体验会一直贯穿全书的主题.所以我们就从用户体验开始,看看Solr是如何让你的用户感觉到爽的. 1.4.1             用户体验类功能 Solr提供了一系列的重要功能来帮助你搭建一个易用的,符合用户直觉的,功能强大的搜索引擎.不过你需要注意的是Solr仅仅是提供了类REST风格的HTTP AP

第一章:认识Yii

第一章:认识Yii 认识Yii 在过去几年中,框架迅速发展,几乎在Web应用开发中,每个人都会涉及到一个新生框架,Web开发框架会帮助你加快你的应用程序发布,你只需迅速的把你的想法在框架的白板上书写功能代码.随着Web应用的实现具有共同特征,现有的框架方案已经满足这些要求,在今天还有什么理由要从头开始你的下一个Web应用呢?今天的Web开发,除程序自身语言外,一个现代化.灵活的和可扩展的框架,几乎是一个至关重要的编程工具,此外,如果语言与框架两个部份有特别的互补性,结果是将一个非常强大的工具包:

《软件工程概论》第一章核心内容

第一章  软件定义:是计算机系统中与硬件相互依存的另一部分,包括程序.数据和相关文档的完整集合. 软件特性:形态特性.智能特性.开发特性.质量特性.生产特性.管理特性.环境特性.维护特性.废弃特性.应用特性.  软件分类.  (1) 系统软件 (2) 应用软件 (3) 支撑软件 (4) 可复用软件   软件危机的原因:1)缺乏软件开发的经验和有关软件开发数据的积累,使得开发工作的计划很难制定.2)软件人员与用户的交流存在障碍,除了知识背景的差异,缺少合适的交流方法和需求描述工具也是重要的一个原因

Javascript高级程序设计——第一章:javascript简介

第一章 javascript简介 1.Javascript简史 javascript诞生于1995年,是由网景公司的Brendan Eich开发的,最初的目的是在客户端处理一些输入验证操作,自此后成为常见浏览器的特色功能,如今用途已经不限于简单的数据验证,而是具备与浏览器窗口及其内容等几乎所有方面交互的能力.当时javascript是为了搭上媒体热炒的java才改名为javascript其最初名为livescript. 在javascript取得巨大成功后,微软公司也在自己的浏览器中加入了名为J

docker容器与容器云 读书笔记一 第一章

第一章:从容器到容器云 1.1    云计算平台经典云计算架构包括了IaaS(Infrastructure as a Service,基础设施即服务).PaaS(Platform as a Service,平台即服务).SaaS(Software as a Service,软件即服务)三层服务 1.2    容器,新的革命 Docker是什么? 基于官方的定义,Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建.发布和运行分布

【数据库原理】第一章 绪论

数据库原理 第一章   绪论 1.1   数据库系统概述 1.1.1      数据库的4个基本概念 1.数据 (1)数据是数据库中存储的基本对象 (2)数据:描述事物的符号记录,可以是数字.文字.图像等 (3)数据的含义称为数据的语意,数据与其语意密不可分 2.数据库 (1)数据库:长期储存在计算机内,有组织的.可共享的大量数据集合 (2)特点 <1>按照一定的数据模型组织.描述和存储 <2>具有较小的冗余度 <3>较高的数据独立性和易扩展性 <4>可为各