随笔分类 -  计算机基础知识

虚函数表
摘要:C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰的剖析。当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,没 阅读全文

posted @ 2011-10-07 10:59 伪君 阅读(172) 评论(0) 推荐(0)

回调函数
摘要:5.回调函数上一页第24章函数接口下一页5.回调函数请点评如果参数是一个函数指针,调用者可以传递一个函数的地址给实现者,让实现者去调用它,这称为回调函数(Callback Function)。例如qsort(3)和bsearch(3)。表24.7.回调函数示例:void func(void (*f)(void *), void *p);调用者实现者提供一个回调函数,再提供一个准备传给回调函数的参数。把回调函数传给参数f,把准备传给回调函数的参数按void *类型传给参数p在适当的时候根据调用者传来的函数指针f调用回调函数,将调用者传来的参数p转交给回调函数,即调用f(p);以下是一个简单的例子 阅读全文

posted @ 2011-09-25 09:56 伪君 阅读(333) 评论(0) 推荐(0)

delete和delete[]
摘要:C++告诉我们在回收用new分配的单个对象的内存空间的时候用delete,回收用new[]分配的一组对象的内存空间的时候用delete[]。楼主的这个问题提得很好。很多人注意到了这个问题,但是却不清楚为什么要这样做,不这样做行不行。关于new[]和delete[],其中又分为两种情况:(1)为基本数据类型分配和回收空间;(2)为自定义类型分配和回收空间。对于(1),上面提供的程序已经证明了delete[]和delete是等同的。但是对于(2),情况就发生了变化。请看下面的程序。#include<iostream>;usingnamespacestd;classT{public:T( 阅读全文

posted @ 2011-09-22 09:41 伪君 阅读(221) 评论(0) 推荐(0)

深入探讨C++中的引用
摘要:引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有搞清本源。故在本篇中我将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖引玉的作用。 一、引用简介 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名; 【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名 说明: (1)&在此不是求地址运算,而是起标识作 阅读全文

posted @ 2011-09-19 16:07 伪君 阅读(162) 评论(0) 推荐(0)

关于sizeof
摘要:昨天看了一些C语言问题(http://www.gowrikumar.com/c/)以及国内几个Geeks的解答(http://wangcong.org/blog/?p=291,http://www.matrix67.com/blog/archives/429),看来自己的C基础还是可以的,没遇到什么大问题。有时候自己也去分析过IOCCC(http://www.ioccc.org/)的代码,或多或少可以学到一些东西。尽管听起来都像是“‘回’字有四样写法”的那样。 说几条我最近想到的问题及其解答,都是关于sizeof的: 1、sizeof(i++)之后,i的值会怎样?答案是不变。记得大一初... 阅读全文

posted @ 2011-09-19 14:36 伪君 阅读(460) 评论(0) 推荐(0)

堆与栈有什么区别?
摘要:一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放4、文字常量区 —常量字符串就是放在这里的。 阅读全文

posted @ 2011-09-17 16:52 伪君 阅读(212) 评论(0) 推荐(0)

基本数据类型
摘要:int类型比较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量用__int16 __int32 __int64吧,或者自己typedefintINT32一下。C、C++标准中只规定了某种类型的最小字节数(防止溢出)64位指的是cpu通用寄存器的数据宽度是64位的。找到一个图数据类型名称字节数别名取值范围int*signed,signedint由操作系统决定,即与操作系统的”字长”有关unsignedint*unsigned由操作系统决定,即与操作系统的”字长”有关__int81char,signed char–128 到 127__int162short,shortint,si 阅读全文

posted @ 2011-05-25 15:47 伪君 阅读(199) 评论(0) 推荐(0)

CONST的学问C&&C++
摘要:C语言const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。另外CONST在其他编程语言中也有出现,如C++、PHP5、C#.net、HC08 C。 C中CONST的使用:虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。问题:const变量 & 常量为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?const int n = 5;int 阅读全文

posted @ 2011-05-19 11:26 伪君 阅读(248) 评论(0) 推荐(0)

进程与线程
摘要:进程和线程是两个相对的概念,通常来说,一个进程可以定义程序的一个实例(Instance)。在Win32中,进程并不执行什么,它只是占据应用程序所使用的地址空间。为了让进程完成一定的工作,进程必须至少占有一个线程,正是这个线程负责包含进程地址空间中的代码。实际上,一个进程可以包含几个线程,它们可以同时执行进程地址空间中的代码。为了做到这一点,每个线程有自己的一组CPU寄存器和堆栈。每个进程中至少有一个线程在执行其地址空间中的代码。如果没有线程执行进程地址空间中的代码,进程也就没有继续存在的理由,系统将自动清除进程及其地址空间。多线程的实现原理创建一个进程时,它的第一个线程称为主线程(Primar 阅读全文

posted @ 2011-05-17 10:24 伪君 阅读(225) 评论(0) 推荐(0)

线程同步
摘要:临界区(criticalSection)又称阻塞,它能够使一段代码只由一个线程来执行,其它线程被挡在这段代码之外,直到第一个线程执行完代码。临界区的使用主要涉及如下API函数:initializeCriticalSection(), 在临界区首次使用之前,用此函数进行初始化。deleteCreticalSection(), 在临界区不再使用之前,用此函数释放临界区。enterCriticalSection(), 在初始化之后,用此函数进入阻塞。leaveCriticalSection(), 在代码执行完之后,用此函数解除阻塞。互斥(mutex)互斥比较类似阻塞,关键在于互斥可以跨进程的线程同步 阅读全文

posted @ 2011-05-17 10:23 伪君 阅读(237) 评论(0) 推荐(0)

堆和栈
摘要:堆和栈的区别一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。4、文字常量区 — 常量字符串就是放在这里的,程序 阅读全文

posted @ 2011-05-16 11:22 伪君 阅读(152) 评论(0) 推荐(0)

extern "c"
摘要:1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 另外,extern也可用来进行链接指定。2 问题:extern 变量 在一个源文件里定义了一个数组:char a[6]; 在另外一个文件里用下列语句进行了声明:extern char *a; 请问,这样可以吗? 答案与分析: 1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern c 阅读全文

posted @ 2011-05-16 09:12 伪君 阅读(236) 评论(0) 推荐(0)

导航