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: ...
随机推荐
- 用React.addons.TestUtils、Jasmine进行单元测试
一.用到的工具 1.React.addons.TestUtils 2.Jasmine 3.Browserify(处理jsx文件的require依赖关系) 4.Reactify(能和browserify ...
- C++工具系列博文合集
http://www.cnblogs.com/itech/category/240779.html
- 喵星人教你记 HTTP 状态码
记忆HTTP状态码是有一些困难的,因为状态码很多且很难记忆.GirlieMac,也就是Tomomi Imura利用她巧妙的构思,PS了一系列的HTTP状态信息.在你看过这些图片之后,你绝对可以记住一些 ...
- mysql中bigint在php中表示
http://bbs.csdn.net/topics/340266753 http://www.percona.com/blog/2008/01/10/php-vs-bigint-vs-float-c ...
- MySQL5.7表空间加密
MySQL5.7开始支持表空间加密了,增强了MySQL的数据文件的安全性,这是一个很不错的一个功能,这个特性默认是没有启用的,要使用这个功能要安装插件keyring_file. 下面就来看看怎么安装, ...
- js学习对象创建
Object.extend = function(destination, source) {for (var property in source) { destination[propert ...
- apk反编译(6)ProGuard 工具 android studio版官方教程[作用,配置,解混淆,优化示例]
ProGuard In this document Enabling ProGuard (Gradle Builds) Configuring ProGuard Examples Decoding O ...
- 购买使用Linode VPS必须知晓的十个问题
Linode是国外非常著名的VPS商之一,目前在国内站长圈中备受推崇.有许多站长已经购买了Linode VPS,但是部分站长由于中英语言不通,对Linode的政策不了解,从而造成了许多不必要的损失.本 ...
- 1008. Image Encoding(bfs)
1008 没营养的破题 #include <iostream> #include<cstdio> #include<cstring> #include<alg ...
- Android加速度传感器实现“摇一摇”,带手机振动
由于代码有点多,所以就分开写了,注释还算详细,方便学习 Activity package com.lmw.android.test; import android.app.Activity; im ...