话接前篇,继续谈在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++ 我想这样用(三)的更多相关文章

  1. 最想做的三个Delphi项目:Paint,IM,SQL,另外还有Smart,TMS,FMX,UML,FreePascal,Python4Delphi,Cheat Engine

    都是绝美项目- 如果有时间,要做的项目:0. 整整5个Cloud项目(可带来商业收益,其中还包括手机发送, S/D/N/L/NetDriver)1. Heidi/front/SQLITE STUDIO ...

  2. 后端程序员看前端想死(三)是不是该学点js了

    CSS盒子模型 div布局 js 这些都懂一点,但仅仅是懂一点,有时间就学一下咯

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

    括号 正则表达式中的括号能将多个字符或者表达式当做一组,即将他们看成一个整体.这样量词就可以修饰这一组表达式.阅读本章前,建议先下载我于CSDN上传的示例代码,下载无需分数,下载链接. 1.分组 假设 ...

  4. linux运维中的命令梳理(三)

    ----------文本操作命令---------- sed命令:文本编辑工具 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特 ...

  5. 第三十九课:requestAnimationFrame详解

    大家应该都知道,如果一个页面运行的定时器很多,无论你怎么优化,最后肯定会超过指定时间才能完成动画.定时器越多,延时越严重. 为此,YUI,kissy等采用中央队列的方式,将定时器减少至一个.浏览器厂商 ...

  6. 哥德巴赫猜想证明(C语言实现50以内的正偶数证明)

    <一>哥德巴赫猜想内容: 一个充分大的偶数(大于或等于6)可以分解为两个素数之和. <二>实现要点: 要点: 判断素数(质数):除了1和本身没有其他约数. 最小的质数:2 判断 ...

  7. Jquery第三篇【AJAX 相关的API】

    前言 前面我们已经学了讲解了Jquery的选择器,关于DOM 的API还有事件的API.本博文需要讲解Jquery对AJAX的支持- 我们在开始使用JavaScript学习AJAX的时候,创建异步对象 ...

  8. nodejs爬虫笔记(三)---爬取YouTube网站上的视频信息

    思路:通过笔记(二)中代理的设置,已经可以对YouTube的信息进行爬取了,这几天想着爬取网站下的视频信息.通过分析YouTube,发现可以从订阅号入手,先选择几个订阅号,然后爬取订阅号里面的视频分类 ...

  9. Django之Models(三)

    Django之Models(三) 创建多对多关系 第一种方式:创建多对多的关系authors=models.ManyToManyField("Author") class Publ ...

  10. 性能测试三十三:监控之Linux系统监控命令大全

    1.top命令top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top - 01:06:48 up 1: ...

随机推荐

  1. Android:设计之屏幕适配

    据统计目前市场Android手机的分辨率有是10余种,分辨率如此广泛使得我们在处理分辨率适应方便遇到不少难题,本文就此难点记录设计与实际布局中的解决技巧. 以320x480为蓝本设计布局 因为Andr ...

  2. 微信开发之——Php批量生成带参数的二维码

    带参数的二维码对于渠道营销推广来说是很有用的,可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送,可喜的是微信开通了这个接口,那下面就来研究一下吧. 具体接口说明请参见,微信公众平 ...

  3. C++:类型转换

    5.3 类型转换 5.3.1 系统预定义类型间的转换 1. 隐式转换: 例如: int x=5,y;             y=3.5+x; //系统会自动先将int型的5转换为double型的5. ...

  4. Android listview的item设定高度

    在item的layout文件中,用android:layout_height设置item的高度.运行,高度设置无效. 解决办法: 给item设定minHeight,即可. -------------- ...

  5. PHP比你想象的好得多

    有很多对于PHP的抱怨,甚至这些抱怨也出自很多聪明的人.当Jeff Atwood写下对于PHP的另一篇抱怨文章之后,我思考了下PHP的好的方面. 这些抱怨最大的问题是他们出自很多仍在使用旧版本PHP的 ...

  6. AVL的旋转

    转自http://blog.csdn.net/gabriel1026/article/details/6311339 平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树 ...

  7. uva10820Send a Table

    筛法. 首先使cnt[i]=sqr(n/i),这样cnt[i]就表示gcd(x,y)大于等于i的数对的个数,然后倒序枚举减去gcd大于i的个数就可以得到ans[i].最终得到ans[1]. 这个算法单 ...

  8. android webview js alert对话框 不能弹出 解决办法

    在配置了webview的 setting属性后,以前设置的都是可以直接弹出来的,今天写一个小demo时候莫名其妙的发现alert怎么也出来,即使设置了这么多也不行: webSettings.setJa ...

  9. C扩展Python - official docs - defining new type

    1. Code & Official_doc: THIS 2. My question. #include <Python.h> /* * 1.PyTypeObject doc, ...

  10. Liunx 配置IDE

    如果你还没装编译环境或自己不确定装没装,不妨先执行 sudo apt-get install build-essential 如果你已经了解一些 vim 的知识,而且想用它来编辑源代码,那么我们不妨装 ...