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++ 我想这样用(三)的更多相关文章
- 最想做的三个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 ...
 - 后端程序员看前端想死(三)是不是该学点js了
		
CSS盒子模型 div布局 js 这些都懂一点,但仅仅是懂一点,有时间就学一下咯
 - .NET正则表达式基础入门(三)
		
括号 正则表达式中的括号能将多个字符或者表达式当做一组,即将他们看成一个整体.这样量词就可以修饰这一组表达式.阅读本章前,建议先下载我于CSDN上传的示例代码,下载无需分数,下载链接. 1.分组 假设 ...
 - linux运维中的命令梳理(三)
		
----------文本操作命令---------- sed命令:文本编辑工具 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特 ...
 - 第三十九课:requestAnimationFrame详解
		
大家应该都知道,如果一个页面运行的定时器很多,无论你怎么优化,最后肯定会超过指定时间才能完成动画.定时器越多,延时越严重. 为此,YUI,kissy等采用中央队列的方式,将定时器减少至一个.浏览器厂商 ...
 - 哥德巴赫猜想证明(C语言实现50以内的正偶数证明)
		
<一>哥德巴赫猜想内容: 一个充分大的偶数(大于或等于6)可以分解为两个素数之和. <二>实现要点: 要点: 判断素数(质数):除了1和本身没有其他约数. 最小的质数:2 判断 ...
 - Jquery第三篇【AJAX 相关的API】
		
前言 前面我们已经学了讲解了Jquery的选择器,关于DOM 的API还有事件的API.本博文需要讲解Jquery对AJAX的支持- 我们在开始使用JavaScript学习AJAX的时候,创建异步对象 ...
 - nodejs爬虫笔记(三)---爬取YouTube网站上的视频信息
		
思路:通过笔记(二)中代理的设置,已经可以对YouTube的信息进行爬取了,这几天想着爬取网站下的视频信息.通过分析YouTube,发现可以从订阅号入手,先选择几个订阅号,然后爬取订阅号里面的视频分类 ...
 - Django之Models(三)
		
Django之Models(三) 创建多对多关系 第一种方式:创建多对多的关系authors=models.ManyToManyField("Author") class Publ ...
 - 性能测试三十三:监控之Linux系统监控命令大全
		
1.top命令top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top - 01:06:48 up 1: ...
 
随机推荐
- Entity Freamwork 6连接PostgreSql数据库
			
原文 Entity Freamwork 6连接PostgreSql数据库 开发环境 VS 2015 Update 1 Postgre Sql 9.4 使用过程 1.使用Nuget在项目中添加对E ...
 - Android 类似时间轴的实现
			
想要实现图片中的的时间轴的效果,设定了三种颜色,但是出来的只有一个黑色,还不是设定好的,而且长度很长的话不能滚动,下面上代码: 布局文件: <LinearLayout xmlns:android ...
 - Intellij IDEA 创建消息驱动Bean - 接收JMS消息
			
除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...
 - Mmap的实现原理和应用
			
http://blog.csdn.net/edwardlulinux/article/details/8604400 很多文章分析了mmap的实现原理.从代码的逻辑来分析,总是觉没有把mmap后读写映 ...
 - Eclipse中查看JDK源码设置
			
设置方法如下: 1.路径 window-> Preferences -> Java -> Installed JRES 2.此时"Installed JRES"右 ...
 - android的helloworld工程目录学习
			
android的helloworld工程目录学习 Android工程的主要目录有src.gen.Android X.X.bin.res等文件夹. 1. Src文件夹 Src文件夹包含java源 ...
 - Jeally Bean中MonekyRunner 帮助文件
			
基于4.2的SDK导出来的MonkeyRunner的最新帮助,这个版本对MonkeyView和MonkeyRect有了很大的加强,在MonkeyRunner的易用性上有了很大的提高. 对于导出Monk ...
 - 函数lock_rec_get_first
			
/*********************************************************************//** Gets the first explicit l ...
 - BZOJ3858: Number Transformation
			
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3858 题解:设第i个数为i*a;第i+1个数为(i+1)*b.则(i+1)*b>i*a; ...
 - Jquery 模板插件 jquery.tmpl.js 的使用方法(2):嵌套each循环,temp调用(使用预编译的模板缓存)
			
直接上代码吧 一:主窗口 /*#region SendChooseTargetTemplate 发送候选人主窗口模板*/ var SendChooseTargetTemplate = ''; Send ...