C++ 我想这样用(三)

话接前篇,继续谈在C++环境下使用C风格编程时的注意点:

6.关于原型的声明

在C里,调用一个未声明的函数是允许的,但是在C++里,必须先声明才能调用函数。另外,如果函数的参数是空的,那么在c里面是未定义参数列表,在C++里面却是void。

Example

extern void func();
          ....
          sub();
          func(0);

所以上面的sub();在c里对,在C++里就错了,func(0);也是一样的。

我的建议是:任何C语言的编程典范,都是建议函数先声明后使用的,在C99之后更是这样,如果你不是上个世纪来的编程大佬,请不要再使用K&R的风格了。。

7.关于关键字

下面这些关键字是C++里有但是C里面没有的:

asm             bool            catch           class
          const_cast      delete          dynamic_cast    explicit
          false           friend          inline          mutable
          namespace       new             operator        private
          protected       public          reinterpret_cast
          static_cast     template        this            throw
          true            try             typeid          typename
          using           virtual

我列出这些的意思不是说要花时间来掌握他们,因为我的原则在C++ 我想这样用(一)就说过了,我只用和对象有关的极少的一部分C++的东西。

我的意思是指,不要再把这些东西用作标识符了,原因不说即明。或许你觉得这条很多余,但是如果你真的像我一样很喜欢用C来模拟实现面向对象,那么看看你以前的代码吧,你就知道这条多么重要了。。。。。。

8.关于内存管理

在上一篇中就有好心吧友提醒我关于new的问题,没错接下来我就说说把,先看一例:

Example

int (*p)[10];
          p = (int (*)[10])malloc(sizeof(*p));
          ....
          delete p;

  
          /* The delete expression has undefined behavior. */

没错,如果你用delete干掉一块malloc分出来的内存空间,天知道会发生什么,这全看编译器的心情。说白了人家new和delete是一对,malloc(or calloc or realloc)和free是一对。不要乱配。你在想什么呢?没错!和我一样!咱们就不用什么new了,反正也不是C的东西,还是malloc来得舒心,哈哈!

不过很可惜不行,看了下面的事实你就知道了:

  1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
  2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
  3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
  4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
  5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

没错,基本上new=(malloc+执行构造函数+类型转换),我们要面向对象,也就必须用new和delete,我的建议是两条路任你选:

1.除了对象用new和delete,其他情况依旧用你最爱的malloc和free

2.反正new基本可以认为内部实现就调用了malloc,所以以后就全用new和delete吧

9.关于const的类型限定

这还是一个关于默认的问题,如果你在一个文件里写

  const int pi = 3.14;

那么默认的连接属性是:

  extern const int pi = 3.14; (in C)

  static   const int pi = 3.14; (in C++)

多敲一点不会死,我的一贯做法是,不管编译器老人家帮不帮你擦屁股,我肯定是自己擦干净!!

10.关于标准库

没错,标准库是和语言最近的东西,基本上我们每天都在用,于是来到了C++环境,这也成为了一个问题。幸好C++在这方面做的很到位,几乎在主流的平台的C++编译器上,你可以放心使用全部的C标准库。

在这个系列里,没有.h结尾的头文件(包括那些cstdio什么的。。)是绝对禁用的,如果你感到不适,请不要在意,因为这篇文章是写给“重度强迫症+C脑残粉”的。很庆幸你不是=  =!

如果你不幸中枪,那么恭喜你,下面这些是你最喜欢的:

C89中有15个标准头文件:

<assert.h> 、<ctype.h> 、 <errno.h>、 <float.h>、 <limits.h>、 <locale.h>、

<math.h> 、 <setjmp.h> 、<signal.h> 、<stdarg.h>、<stddef.h> 、

<stdio.h>、 <stdlib.h>、 <string.h>  、<time.h>

C95增加了3个标准头文件:<iso646.h>、<wchar.h>、<wctype.h>

C99增加了6个标准头文件:

<complex.h> 、<fenv.h>、<inttypes.h> 、<stdbool.h> 、<stdint.h>、<tgmath.h>

关于注意点,我就写这么10点了,我知道其实还有很多很多,尤其是C99的出现使得情况更严重。如果大家有补充或建议和纠正,请积极留言哦。

此外,我向大家推荐clean-c这个东西,可以说是C与C++的交集。算不上取C语言的子集,也就是对C特性做一些更严格些的约束条件,使得这些特性能同时符合标准C语言和标准C++语言的规定。用这个东西写出来的代码可移植性非常高,据说Lua就是用它写的呢。不过我没找到clean c的正规文档或项目主页,谁知道的,望分享啊。。

后续的文章就是具体的面向对象的部分了,究竟怎么组织我还在构思。。。。。

C++ 我想这样用(三)

时间: 2024-10-14 02:27:40

C++ 我想这样用(三)的相关文章

企业请想清楚这三个问题再谈网站建设

http://passport.baidu.com/?business&un=%E6%B5%B7%E5%8C%97%E6%9C%89%E7%BE%8E%E5%A5%B3%E6%8C%89%E6%91%A9#0 http://passport.baidu.com/?business&un=%E9%BB%84%E5%8D%97%E6%9C%89%E7%BE%8E%E5%A5%B3%E6%8C%89%E6%91%A9#0 http://passport.baidu.com/?business&a

.NET正则表达式基础入门(三)

括号 正则表达式中的括号能将多个字符或者表达式当做一组,即将他们看成一个整体.这样量词就可以修饰这一组表达式. 1.分组 假设我们要匹配偶数个数字,如何匹配?尝试"^\d{2}+$"来匹配."\d{2}"匹配2个数字,"+"匹配至少一次,两者组合起来应该是偶数个数字.但是由下例可看出这个正则表达式并不合法.只能尝试修改这个正则表达式为"^(\d{2})+$".将"\d{2}"看做一个分组,再来使用量词. R

VMware Workstation之虚拟网络的三种连接模式浅析

刚开始接触VMware Workstation做实验时常常为选择哪种网络连接模式而苦恼. 有时候老师说选择NAT,有时候建议桥接,还有时会要求仅主机. 唉,真是老师说什么就是什么. 既然不懂那就乖乖跟着老师屁股后面,老师怎么要求我们就怎么做,一点自己发挥的余地都不能有. 机械的跟着老师做了这么多实验,吃了这么多的苦楚,大家有没有想过,我们搭建实验环境为什么要选择不同的网络连接模式,为什么我们实验的其他部署都对了,但就是因为忽略了连接模式这个小差错而导致各种报错,为什么老师一直说实验前的ping通

产品经理的三种特质

十多年来,自己换了很多种头衔,最近常挂在嘴边的是产品经理.自从有了苹果,产品经理这个词仿佛得到了乔布斯的加持,变得神圣而光荣.世间也从此有了各种样式的产品经理,有的神奇,有的神经,有的神妙,有的神棍. 那么,什么是产品经理呢,很难界定.一千个用户,就有一千个产品经理,一万个产品诉求.人人都能成为产品经理,我心目中好的产品经理,应该具备三种特质. 首先,爱得深. 深爱产品,这是成为顶尖产品经理的第一前提. "为什么我的眼里常含泪水,因为我对这土地爱得深沉",唯有爱得深,才能心无旁骛,全力

第三十九课:requestAnimationFrame详解

大家应该都知道,如果一个页面运行的定时器很多,无论你怎么优化,最后肯定会超过指定时间才能完成动画.定时器越多,延时越严重. 为此,YUI,kissy等采用中央队列的方式,将定时器减少至一个.浏览器厂商也因此原生支持了requestAnimationFrame方法,此方法基本上能保证每秒刷新60次.但是此方法在还没形成标准之前,很多低版本浏览器是不支持的,比如:IE9以及以下版本,不过谷歌和火狐都用私有的方法名实现了requestAnimationFrame方法.比如:谷歌:webkitReque

ActoinBar Overflow 显示问题 (三个点不显示)

actionBar 上面 部分机型 显示不出来 三个点那个按钮 ,大概的解释是 如果设备有菜单功能键,显示隐藏动作的功能将会由Menu菜单功能键实现 就是 有实体的菜单键 就会由菜单键替代. 如果想强制显示 这三个点的按钮,那么将下面这个方法 放入oncreate里面调用. private void getOverflowMenu() {       try {          ViewConfiguration config = ViewConfiguration.get(this);   

如果你是PM,想转PM,拿走

欢迎使用Markdown编辑器写博客 陈医生发神功串烧26首流行曲目,勇夺金曲奖.小伙伴们若是能串烧26本PM好书,那还不得笑傲PM江湖!26本好多,我们可以慢慢来,这次小编给各位介绍10本PM超级相关图书,不是最抢眼的,却是最实用的.并非适合所有人,但可能是你寻千百度,却在灯火阑珊处的那本. 1.<产品经理必知必会> 最简单易学的产品经理入门书 本书从介绍产品和产品管理是什么开始,阐述了数字时代如何更有目的性地设计网页和应用类产品,让读者理解产品管理的重要性,从而能够更好地保障产品的成功.主

转载自知乎:程序员干到三十就干不动了」的说法是从哪来的?

http://www.zhihu.com/question/28432389 这类谣传很难追根溯源的. 最早大概来自8x-9x年代的第一代程序员. 这时候多半是一种自嘲. 那时改革开放没多久,国内IT业刚刚起步,教材.经典书籍什么的……还是别想太多了.当时很多基础性的东西甚至是靠类似反编译之类手段逆向出来的.从现象反推原因,自然错漏极多(比如谭浩强著名的i=i+i++错误,就属于这类问题),而且琐碎.不成体系. 比如,国内的编译原理教材,忘了是清华出的还是同济的,甚至连为什么需要终结符.终结符是

提升 10 倍效率的三件事

几乎每个软件开发人员或程序员都见过其他人编写的代码,说明了"任何人都可以编码".但你有没有遇到过所谓的神话般的"10倍效率的开发人员"?作为一个10倍效率的开发人员,在编写代码方面做得很少, 更多的是知道要写什么代码. 我们许多人开始编程的时候都有特定的目的.比如,我开始编程的时候,是让我能在睡觉和在学校的时候自动玩那个文字版的MUD游戏.我那时候是个写脚本的13岁小孩,甚至不知道什么是编程.我可能有一个想法,然后就写代码并测试 – 全部靠我自己. 当我们为其他人开

规则三:三次简化方案

规则三:三次简化方案 砍掉很多无关紧要的东西,留下精华,奉行极简主义 内容:在设计复杂系统时,从项目的范围.设计和实施角度简化方案. 场景:当设计复杂系统或产品时,面临着技术和计算资源的限制. 用法 采用帕累托( Pareto)原则简化范围 考虑成本优化和可扩展性来简化设计 依靠其他人的经验来简化部署 原因:只聚焦"不过度复杂",并不能解决需求或历史发展与沿革中的各种问题 要点:在产品研发的各个阶段都需要做好简化 鉴于规则1,主要是关于避免超过"有用的"(实际的)需