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

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

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

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

  1. // meta-language rule:
  2. // pq的一个declaration,而不是invocation
  3. 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.

  1. // struct名称(或class名称)临时省略
  2. {
  3. public:
  4. virtual void foo();
  5. protected:
  6. static int object_count;
  7. };

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

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

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

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

  1. struct mumber {
  2. /* stuff */
  3. char pc[1];
  4. };
  5. // 从档案或标准输入装置中取得一个字符串
  6. // 然后为struct本身和该字符串配置足够的内存
  7. struct mumble *pmumbl = (struct mumble *)
  8. malloc(sizeof(struct mumble) + strlen(string) + 1);
  9. 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++的部分:

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

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

  1. extern void draw_line(Point, Point);
  2. draw_line(Point(0, 0), Point(100, 100));
  3. draw_rect(Point(0, 0), Point(100, 100));

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

  1. struct C_point {...};
  2. class Point {
  3. public:
  4. operator C_point() { return _c_point; }
  5. private:
  6. C_point _c_point;
  7. };

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

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

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

    第一章    关于对象 在C语言中,"数据"和"处理数据的操作(函数)"是分开声明的,也就是说,语言本身并没有支持"数据和函数"之间的关联性 ...

  2. SEO 第一章

    SEO  第一章 第一章:SEO基础知识 第二章:搜索引擎基础 第三章:关键词分析 第四章:TDK优化 第五章:网站的URL优化 第六章:网站的内链优化 第七章:代码优化 第八章:网站的内容优化 第九 ...

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

    本系列的博客是由本人在阅读<JavaScript DOM编程艺术>一书过程中做的总结.前面的偏理论部分都是书中原话,觉得有必要记录下来,方便自己翻阅,也希望能为读到本博客的人提供一些帮助, ...

  4. (转)iOS Wow体验 - 第一章 - iOS人机界面设计规范纵览

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第一章译文精选,其余章节将陆续放出. 关于本套译文 ...

  5. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  6. 漫谈格兰杰因果关系(Granger Causality)——第一章 野火烧不尽,春风吹又生

    2017年7月9日上午6点10分,先师胡三清同志--新因果关系的提出者.植入式脑部电极癫痫治疗法的提出者.IEEE高级会员,因肺癌医治无效于杭州肿瘤医院去世,享年50岁.余蒙先师厚恩数载,一朝忽闻先师 ...

  7. javascript高级程序设计第一章有感

    第一章JavaScript简介 Javascript的诞生最早是为了处理表单数据验证的问题,以前主要是使用perl这个强大的服务端脚本语言处理的.在未诞生javascript之前, 人们每次提交表单就 ...

  8. CentOS 7.4 初次手记:第一章 Linux守护进程(daemon)

    第一节 init & sysvinit 6 I sysvinit 运行顺序... 6 II Sysvinit和系统关闭... 7 III Sysvinit 的小结... 7 IV 运行级别.. ...

  9. 【黑金原创教程】【Modelsim】【第一章】Modelsim仿真的扫盲文

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

随机推荐

  1. $P5017 摆渡车$

    problem 毒瘤\(DP\) #ifdef Dubug #endif #include <bits/stdc++.h> using namespace std; typedef lon ...

  2. 用python语言写一个简单的计算器

    假如我们有这样一个式子: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2 ...

  3. 胖ap和瘦ap的区别

    一,什么是AP,胖瘦AP如何区分?       先说说AP的概念.AP是Access Point的简称,即无线接入点,其作用是把局域网里通过双绞线传输的有线信号(即电信号)经过编译,转换成无线电信号传 ...

  4. C#学习-程序集和反射

    准备项目 1.新建一个空的解决方案MyProj.sln 2.在该解决方案下,建一个控制台项目P01.csproj 3.在该项目下,自己新建一个类MyFirstClass.cs 查看解决方案MyProj ...

  5. SpringAop--系统日志简例

    通过Spring的Aop我们可以声明式的配置事务管理,那么同样可以通过SpringAop来进行处理的系统日志该如何实现呢? 一.数据表和实体类的准备 我们要管理系统日志,那么数据表和实体类是必不可少的 ...

  6. 关闭掉eclipse启动的自动更新功能(提高打开eclipse的速度)

  7. 六时出行 App 隐私政策

    六时出行 App 隐私政策   本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义 ...

  8. HDU_5723_最小生成树+任意两点距离的期望

    Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  9. getdlgitemtext

    获取控件内信息 set 设置控件内信息 oninitdialog初始化控件时的操作

  10. vue04 组件化开发 Vue自动化工具

    5. 组件化开发 5.1 组件[component] 组件(Component)是自定义封装的功能.在前端开发过程中,经常出现多个网页的功能是重复的,而且很多不同的网站之间,也存在同样的功能. 而在网 ...