快捷搜索:  
C++中union的应用剖析

C++中union的应用剖析

前言 熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"-"来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但是在C++中的union又有了新的扩展,这需要大家了解,要不然你会感到费解和迷惑。下面我讲两点。 一、在union中存储对象 在C中union中可以存储任意类型的内置数据类型,那么在C++中union是否可以存储对象呢?还是让我们看一个例子吧,这比任何言语都能说明问题,不...

基础入门:C++编程易范的错误

基础入门:C++编程易范的错误

C/C++语言中有许多对初学者(甚至是有经验的编程人员)来说很容易范的错误。通晓这样的错误可使你免于陷入其中。 忘记初始化指针 这个表达式的问题是单个表达式包含有相互副作用的两个子表达式——变量nI是增量。哪个nA[nI++]首先被执行,左边的nA[nI++]还是右边的nA[nI++]?没法说,上述代码可能会以预期的方式工作,但也可能不会。 说明虚拟成员函数 为了在子类中重载虚拟成员函数,必须用和基本类中函数一样的形式说明子类中函数的参数和返回类型。这并不总是清楚的。例如,下列代码似乎讲得通: clas...

More  Effective  C++之效率

More Effective C++之效率

我怀疑一些人在C++软件开发人员身上进行秘密的巴甫洛夫试验,否则为什么当提到“效率”这个词时,许多程序员都会流口水。(Scott Meyers真幽默 译者注) 事实上,效率可不是一个开玩笑的事情。一个太大或太慢的程序它们的优点无论多么引人注目都不会为人们所接受。本来就应该这样。软件是用来帮助我们更好地工作,说运行速度慢才是更好的,说需要32MB内存的程序比仅仅需要16MB内存的程序好,说占用100MB磁盘空间的程序比仅仅占用50MB磁盘空间的程序好,这简直是无稽之谈。而且尽管有一些程序确是为了进行更复杂...

c++中关于堆内存(heap)的概念和操作方法的教程

c++中关于堆内存(heap)的概念和操作方法的教程

堆内存是什么呢? 我们知道在c/c++中定义的数组大小必需要事先定义好,他们通常是分配在静态内存空间或者是在栈内存空间内的,但是在实际工作中,我们有时候却需要动态的为数组分配大小,在这里c库中的malloc.h头文件中的malloc()函数就为您解决了问题,(bc或者是在老的标准中是alloc.h),它的函数原形是void* malloc(size_t size),在动态开辟的内存中,在使用完后我们要使用free()函数来释放动态开辟的内存空间! 下面我们来看一个完整的例子! #include iost...

C++箴言:用传引用给const取代传值

C++箴言:用传引用给const取代传值

缺省情况下,C++ 以传值方式将对象传入或传出函数(这是一个从 C 继承来的特性)。除非你特别指定其它方式,否则函数的参数就会以实际参数(actual argument)的拷贝进行初始化,而函数的调用者会收到函数返回值的一个拷贝。这个拷贝由对象的拷贝构造函数生成。这就使得传值(pass-by-value)成为一个代价不菲的操作。例如,考虑下面这个类层级结构: class Person { public: Person(); // parameters omitted for simplicity vir...

你我都需了解:C++设计目标和原则

你我都需了解:C++设计目标和原则

一、 C++的设计目标(C++ Design Aims) C++的设计目标,就是要让C++既具有适合于系统程序设计的C语言所具有的可适应性和高效性,又能在其程序组织结构方面具有像Simula那样的语言设施(Simula所支持的这种程序组织结构通常被称为面向对象程序设计风格)。在设计的时候,还做了很大的努力,使得引借自Simula的高层次的程序设计技术能够应用于系统程序设计之中。这即是说,C++所提供的抽象机制能够被应用于那些对效率和可适应性具有极高要求的程序设计任务之中。 上述的C++之设计目标可以小结...

在C++中处理错误的方法

在C++中处理错误的方法

Java语言最好的部分就在于其能充分利用和依赖异常。通过Java的异常,你可以非常有效的处理错误情况。 不幸的是,在C++的很多类库中,并没有把异常作为一个基本的部分。要想在C++中完成和Java中的异常处理过程同级别的功能,你需要非常仔细的在程序中设计异常处理。 首先,你需要在设计文档中指定错误处理。对大多数人来说,对错误处理的设计一般都是在错误发生后才进行。你应该在编写代码之前就设计好针对每个函数的错误处理。 一旦你知道了你的函数会抛出什么类型的异常,你就应该定义异常的等级了。这里要注意一点,和Ja...

C++怎样有效利用非托管并列缓存

C++怎样有效利用非托管并列缓存

Visual Studio安装程序会把Visual Studio的共享库放在一个称为\"并列缓存(side-by-side cache)\"的地方,那怎样才能有效地利用它呢? 在文章开头,先看一个示例。在命令行中,创建一个源文件,输入例1中的代码。(虽然此处使用的是C++/CLI语法,但不管你是用C++/CLI、托管C++、或本地C++,都不影响要讲解的主题。) 例1:lib.cpp usingnamespaceSystem; publicrefclassTest { public: voidCallM...

C/C++数组名与指针区别深入探索

C/C++数组名与指针区别深入探索

引言 指针是c/c++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在c语言的教学过程中也错误得给学生讲解:\"数组名就是指针\"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着c/c++项目的开发,而身边还一直充满这样的程序员,他们保留着\"数组名就是指针\"的误解。 想必这种误解的根源在于国内某著名的c程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文...

快速计算32位数中1的位数

快速计算32位数中1的位数

一句话实现X是否为2的若干次幂的判断 #define is2*n(x) ((x (x - 1))? 0 : 1) int main(void) { int m = 512; cout ((m (m - 1)) ? false : true) endl; //即当m中只有一位为1时,才为若干次幂值 //若有两个及以上1,则(m (m - 1))不为0,输出0,表示不为2的若干次幂 return(0); } 类比:x为2的若干次幂即表示x中1的位数为1,题目转化为求一个32位数中1的位数,如果为1,则表示该...

C++中禁止异常信息传递到析构函数外

C++中禁止异常信息传递到析构函数外

在有两种情况下会调用析构函数。第一种是在正常情况下删除一个对象,例如对象超出了作用域或被显式地delete.第二种是异常传递的堆栈辗转开解(stack-unwinding)过程中,由异常处理系统删除一个对象。 在上述两种情况下,调用析构函数时异常可能处于激活状态也可能没有处于激活状态。遗憾的是没有办法在析构函数内部区分出这两种情况。因此在写析构函数时你必须保守地假设有异常被激活,因为如果在一个异常被激活的同时,析构函数也抛出异常,并导致程序控制权转移到析构函数外,C++将调用terminate函数。这个...

c++开发中数据结构和算法的分离

c++开发中数据结构和算法的分离

相信每一个在windows下编过程序的人都或多或少地用过位图,大多数人是从网上下载一些成熟完善的dib类库来使用(例如cximage、cdib),少数人有一套自己封装好的dib类库,方便以后的扩充和使用。(近几年gdi+异军突起,在某些处理方面,如:缩放、旋转、渐变填充等它提供无与伦比的速度和质量,但,如果你想做一个完善的图像处理程序,直接使用它会给架构设计带来困难,你可以用adapter模式封装它后再使用)。 这时候,如果你需要一些图像处理操作你会怎么办呢?很多没有oo经验的c++程序员(例如一年前的...