C++中的健壮指针和资源管理
我最喜欢的对资源的定义是:"任何在你的程序中获得并在此后释放的东西。"内存是一个相当明显的资源的例子。它需要用new来获得,用delete来释放。同时也有许多其它类型的资源文件句柄、重要的片断、Windows中的GDI资源,等等。将资源的概念推广到程序中创建、释放的所有对象也是十分方便的,无论对象是在堆中分配的还是在栈中或者是在全局作用于内生命的。 我最喜欢的对资源的定义是:"任何在你的程序中获得并在此后释放的东西。"内存是一个相当明显的资源的例子。它需要用new来获得,用delete来释放。同时也有许...
轻轻松松from C to C++
摘要 C++技术固然是很时髦的,许多C用户都想在尽可能短的时间内为自己贴上C++的标签。介绍C++的书很多,但只有那些已经侥幸入门的用户才偶尔去翻翻,仍有不少在C++门口徘徊的流浪汉。 本文只针对C用户,最好是一位很不错的老用户(譬如他在遇到最简单的问题时都尝试着使用指针),通过一些C和更好的C++(本文用的是Borland C++3.1版本)例程介绍有关C++的一些知识,让读者朋友们“浅入深出”,轻轻松松C to C++! 一、标签!标签! 快快为你的程序贴上C++的标签,让你看起来很像个合格的C++...
轻轻松松from C to C++ (二)
二、挑战#define #define是C提供的一条很有用的指令,但在C++中,很有可能杜绝宏指令的使用。 1 .const 宏指令允许用户指定某一标识符的值作为一个常量,如: #define PI 3. 1415926 它也可以用来定义字符串: #define HZK16 "HZK16F" 以下使用可以通过: cout "PI is“PI; cout "Filename: " HZK16; 但宏毕竟不是一个合法的对象,虽然它伪装得很完美。C++为用户提供了常量修饰符const,可以指定某个对象的值为常...
轻轻松松fromC to C++ (三)
4.函数模数(function template) 前面讨论的重载机制用来实现求和操作并不受欢迎,这仿佛还不是C++的风格,例如用户需要求两个其它类型(如字符型)对象的和: Add ('a' ’b’); 它必须再为之准备一个版本,尽管其名字和代码还是那副样子: char Add (char a char b) { return a + b; } 这样无聊的工作会让灰心的用户开始怀念起古老的“宏”。然而,更先进的东西一一模板,却可以很方便地解决以上问题: template class TYPE TYPE...
C++基础:初始化类对象
问题: C++中如何初始化类中的表数据?在C语言中,我能像下面这样初始化结构数组: // struct MYSTRUCT { int x,y,z; }; MYSTRUCT table[] = { { 1,2,3 }, { 4,5,6 }, ... // etc }; // 但是如果MYSTRUCT是个C++类,而不是结构,我编译就会出错。我觉得这是C++的一个不足。 解答: 这个问题完全取决于你如何看待C++。C++的一个优点之一便是它强制你做正确的事情。例如,C++不喜欢创建对象时不调用构造函数。这只...
在 Linux 中使用共享对象
充分利用共享内存并不总是容易的。在本文中,IBM 的 Sachin Agrawal 与我们共享了他的 C++ 专门技术,展示了面向对象如何去利用一个独特而实用的进程间通信通道的关键优势。 就时间和空间而言,共享内存可能是所有现代操作系统都具备的最高效的进程间通信通道。共享内存 同时将地址空间映射到多个进程:一个进程只需依附到共享内存并像使用普通内存一样使用它,就可以开始与其他进程进行通信。 不过,在面向对象编程领域中,进程更倾向于使用共享对象而不是原始的信息。通过对象,不需要再对对象中容纳的信息进行序列...
JAVA和C++区别浅析
JAVA和C++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于c++为了照顾大量的C语言使用者, 而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!JAVA则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深入细致研究的基础上,据弃了其他语言的不足之处,从根本上解决了c++的固有缺陷。 Java和c++的相似之处多于不同之处,但两种语言问几处主要的不同使得Java更容易学习,并且编程环境更为简单。 我在这...
C++基础:函数指针调用方式
// test12.cpp : Defines the entry point for the console application. // #include "stdafx.h" void func(int i) { printf("This is for test %i\r\n", i); } typedef void (*PFUNC)(int); struct FUNC { PFUNC pfunc; }; void callfunc(void pfunc(int), int i) { pfunc(...
C++数据结构学习:二叉树(1)
树 因为现实世界中存在这“树”这种结构——族谱、等级制度、目录分类等等,而为了研究这类问题,必须能够将树储存,而如何储存将取决于所需要的操作。这里有个问题,是否允许存在空树。有些书认为树都是非空的,因为树表示的是一种现实结构,而0不是自然数;我用过的教科书都是说可以有空树,当然是为了和二叉树统一。这个没有什么原则上的差别,反正就是一种习惯。 二叉树 二叉树可以说是人们假想的一个模型,因此,允许有空的二叉树是无争议的。二叉树是有序的,左边有一个孩子和右边有一个的二叉树是不同的两棵树。做这个规定,是因为人们...
C++数据结构学习:二叉树(2)
线索化二叉树 这是数据结构课程里第一个碰到的难点,不知道你是不是这样看,反正我当初是费了不少脑细胞——当然,恼人的矩阵压缩和相关的加法乘法运算不在考虑之列。我费了不少脑细胞是因为思考:他们干什么呢?很欣喜的看到在这本黄皮书上,这章被打了*号,虽然我不确定作者是不是跟我一个想法——线索化二叉树在现在的PC上是毫无用处的...
C语言中的三大定律
自己总结的,觉得能帮助初学者看透一些纷繁复杂的语法规则,理解C语言的真谛 第一次发布,不一定正确,欢迎讨论、指正、补充 1. 表达式定律 任何能产生数值结果的运算、操作都可以作为表达式,并可以放到任何需要数值结果的地方,只要数值类型能够匹配 常见的可以产生数值结果的运算和操作 算术、逻辑、位运算等 ? : 、*等操作 有返回值的函数 常见的需要数值的地方有: 赋值 条件判断 函数调用 2. 类型定律 任何类型都可以在任何需要类型的地方使用 已知特例 函数返回值不能定义为数组类型 常用类型 基本数据类型、...
C++数据结构学习:用栈做表达式求值
栈的应用很广泛,原书只讲解了表达式求值,那我也就只写这些。其实,栈的最大的用途是解决回溯问题,这也包含了消解递归;而当你用栈解决回溯问题成了习惯的时候,你就很少想到用递归了,比如迷宫求解。另外,人的习惯也是先入为主的,比如树的遍历,从学的那天开始,就是递归算法,虽然书上也教了用栈实现的方法,但应用的时候,你首先想到的还是递归;当然了,如果语言本身不支持递归(如BASIC),那栈就是唯一的选择了——好像现在的高级语言都是支持递归的。 如下是表达式类的定义和实现,表达式可以是中缀表示也可以是后缀表示,用头节...