- 博客(47)
- 收藏
- 关注
转载 路由表详解
C:/Documents and Settings/Administrator>route print===========================================================================Interface List0x1 ........................... MS TCP Loopback interface0x2
2008-09-04 00:46:00
2141
原创 extern用法
extern用法 extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字.它告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 1。对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配
2008-04-10 10:14:00
656
原创 多重继承的对象模型
废话少说,在C++中是允许多重继承的,比如有一个派生类CImp派生自CBaseA,和CBaseB。在CImp中覆盖了两个基类中的虚函数。如果一个函数要求基类的指针,而我们传递一个派生类对象的地址,编译器如何保证这是安全的。 在C++中,类是编译期的,为了实现多重继承,在派生类的内存布局中保留了基类的完整信息块,这样当发生派生类到基类的转换的时候,只需要改变指针位置就可以了。如下代码
2007-11-04 00:07:00
880
原创 typedef使用大全2
#define S(s) printf("%s/n", #s); s typedef struct _TS1{ int x, y;} TS1, *PTS1, ***PPPTS1; // TS1是结构体的名称,PTS1是结构体指针的名称// 也就是将结构体struct _TS1 命名为TS1, // 将struct _TS1 * 命名为 PTS1// 将struc
2007-11-01 00:28:00
591
转载 typedef使用大全1
typedef到处都是,但是能够真正懂得typedef使用的不算太多。对于初学者而言,看别人的源码时对到处充斥的typedef往往不知所错,而参考书又很少,所以在此给出一个源码,供大家参考 #include #include /* 避免Visual C的for与标准for的不同 */#definefor if (0); elsefor /* dim(a)
2007-11-01 00:26:00
639
转载 Liskov替换原则(LSP)
Barbara Liskov说: 这里需要如下替换性质-----若对每个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中,用o1替换o2后,程序P的行为功能不变,则S是T的子类型.上面的就是Liskov替换原则,换句话说,就是子类型(sub type)必须能够替换掉它们的基类型(base type).对于LSP的违反也潜在的违反了OCP.如果新派生类的创建会导致
2007-09-03 20:42:00
688
原创 深度探索C++对象模型第一章
终于开始读这本寻求好久的书,可能我现在的层次读起来有些费劲,但我还是决定慢慢一点点看下去,因为有一种兴趣作为动力驱使着我。下面总结下第一章中的一些内容留作以后回顾:C++对象模型c++对象模型的第一个概念是一种“不变量”。1.每一个class产生一堆 指向virtual functions的指针,放在表格中,这个表格称为virtual table(vtbl).2.每一个clas
2007-09-01 16:23:00
614
原创 java到底是按值传递还是按引用传递?
1 数据类型 1.1 PrimitiveType(简单类型) 1.2 ReferenceType(引用类型) 2. 变量 2.1 简单类型变量 2.2 引用类型变量 3.赋值与传递 3.1 对象的赋值 3.2 传递 3.3 final变量能改变吗? 3.4 包装类的赋值与传递
2007-08-21 14:52:00
743
原创 查找匹配字符串(包含所输入的字符串)
#include "stdafx.h"#include #include #include class Word{ char words[10][10];public: Word() { strcpy(words[0],"course"); strcpy(words[1],"english"); strcpy(words[2],"ma
2007-07-26 10:45:00
722
原创 一次读取文件中所有内容
#include #include #include #include #include using namespace std;int main(){string str;ifstream ifile("test.txt");ostringstream tmp;tmpstr = tmp.str();coutsystem("pause");return 0;}
2007-07-26 09:35:00
1518
原创 在C++中运行.exe程序
头文件:#include具体函数:ShellExecute(handle,"open", "路径", NULL, NULL, SW_SHOW );
2007-07-26 08:51:00
811
转载 const总结
首先说明一下使用const的好处: 使用const的好处在于它允许指定一种语意上的约束------某种对象不能被修改--------编译器具体来实施这种约束。通过const,你可以通知编译器和其他程序员某个值要保持不变。只要是这种情况,你就要明确地使用const ,因为这样做就可以借助编译器的帮助确保这种约束不被破坏。 (一) 首先解释一下const与指针的关系: const在指针的声明中有一下三
2007-06-12 21:44:00
581
转载 对C++中引用的补充说明(实例)
#include iostream> #include string> using namespace std; void main(int argc,char* argv[]){ int a=10; int b=20; int &rn=a; cout cout//c++中是无法取得应用的内存地址的,取引用的地址就是取目标的地址!
2007-06-10 23:05:00
616
原创 c++中的explicit关键字
c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class MyClass{public:MyClass( int num );}....MyClass
2007-06-10 17:15:00
689
转载 Lex和Yacc从入门到精通(7)-筛选信息(容错处理)
#if 0 在通常的情况下,我们只关心文本中的一部分信息,但是为了编写词法和语法分析程序,又不得不将所有的结构信息全部描写出来,例如:我们仅仅关心C++源文档中的类名字信息,而不关心类是否有成员变量,是否有成员函数以及是否有其它的一些C++内容。将结构信息全部描述出来的做法是费时费力的,通常的情况往往导致项目的不可完成或者延期完成。另外,作为程序设计者和代码编写者,
2007-06-05 09:41:00
1255
1
转载 Lex和Yacc从入门到精通(6)-解析C/C++包含文件
摘要在这一章里面将要涉及到处理C/C++的包含宏的解析。也就是说要从一大串C/C++ 包含文件的声明中提取出文件名,以及相互依赖关系等等。实际上在这一章里面 使用的Lex和Yacc技术也是非常重要的,这些都会在本章中进行详细讲解。 目录1. 分析 2. Lex文件 3. Yacc文件 4. main.hpp文件 5. main.cpp文件 6. Makefile文件
2007-06-05 09:40:00
3197
1
转载 Lex和Yacc从入门到精通(4)-能够使用C++的Lex和Yacc框架
摘要写这一章的目的就是为了能够提供一个能够使用C++特色的Lex和Yacc框架,这个框架 同前一章的目的一样,也是仅仅为了能够提供一个什么也不作的框架程序,当时有点 不同的就是:这个新的框架使用了C++语法,能够使用所有的C++特色,包括STL的强 劲算法和容器,还有各式各样的C++库。采用C++的目的就是为了能够快速的编码来完 成自己需要完成的任务。 目录1. l
2007-06-05 09:38:00
1555
转载 Lex和Yacc从入门到精通(3)--一个极其简单的lex和yacc程序
摘要在本章中,将会首先给出一个最基本的lex和yacc联合使用的框架,这个基本框架 最主要的特点就是能够正确的被编译。在我学习lex和yacc的过程中经历了无数次 的痛苦折磨,我发现一个一开始足够简单而且能够被正确编译的例子往往能够使 学习者增加学习的兴趣和信心。因此我的所有的文章都尽可能的采用这种方式进 行描述。我写这些文档的最大的愿望就是希望能够减少新手学习的痛苦。希望自 己能够做
2007-06-05 09:37:00
4135
1
转载 Lex和Yacc从入门到精通(2)--正则表达式篇
正则表达式在Unix/Liunx系统中起着非常重要的作用,在很大一部分的程序中都使用了正则表达式,可以这么说:“在Unix/Linux系统中,如果不懂正则表达式就不算会使用该系统”。本文中使用的Lex和Yacc都是基于正则表达式的应用,因此有必要用一篇文档的形式详细说明在Lex和Yacc中使用的正则表达式为何物!其实正则表达式非常简单,用过DOS的人都知道通配符吧,说得简单一点,正则表达式就是
2007-06-05 09:36:00
1668
转载 Lex和Yacc从入门到精通(1)--环境配置篇
Abstract在开发程序的过程中经常会遇到文本解析的问题,例如:解析C语言源程序,编写 脚本引擎等等,解决这种文本解析的方法有很多,一种方法就是自己手动用C或者 C++直接编写解析程序,这对于简单格式的文本信息来说,不会是什么问题,但是 对于稍微复杂一点的文本信息的解析来说,手工编写解析器将会是一件漫长痛苦 而容易出错的事情。本系列文档就是专门用来由浅入深的介绍两个有名的Unix工
2007-06-05 09:32:00
1933
原创 实现键盘输入口令,口令用*号掩盖
#include #include #include #define BACKSPACE 8char *get_password(const char *prompt) { static char buffer[128]; int i = 0; char letter = NULL; printf(prompt); while ((i letter = g
2007-06-01 17:54:00
771
转载 明晰C++内存分配的五种方法的区别
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
2007-05-29 15:25:00
570
原创 getch(),getche(),getchar()的区别
getch(),getche(),getchar()的区别 这个问题,谭浩强的C语言设计第二版没有讲清楚,或者没有讲。查了查其它的资料,总算搞清楚了。 getch()、getche()和getchar()函数 (1) getch()和getche()函数 这两个函数都是从键盘上读入一个字符。其调用格式为: getch(); getche(); 两者的
2007-05-28 00:45:00
878
1
转载 地址、指针与动态内存分配
(1) 地址 01.cpp: C/C++程序运行时,各种数据类型(常量,变量,函数,数组,结构,对象等)在内存中都有地址,知道地址即可取得它们的内容,可用“取地址操作符”&得到地址例01.cpp:取得常量、变量、数组、函数的(首)地址 (2)指针 1 指针是存放另一变量地址的变量;在C/C++中,说明它的一般形式为: " 数据类型 *指针名"2 指针说明时的数据
2007-05-27 21:53:00
2347
原创 有关函数指针数组
今天看书发现这个比较陌生的概念,于是上网查了查,大概有所了解了。通过下面的例子比较容易理解。#include using namespace std; typedef void (*MyFunDef)(const char*); void hello(const char *s) { c
2007-05-15 22:52:00
725
原创 重载、覆盖与隐藏简单剖析
成员函数被重载的特征:1.在同一个类中2.函数名字相同.3.参数不同.4.virtual关键字可有可无.覆盖的特征:1.分别位于基类与派生类中.2.函数名字相同.3.参数相同.4.基类函数必须有virtual关键字例如:#include class Base{public:void f(int x){coutvoid f(float x)
2007-05-15 20:17:00
693
原创 已知前序遍历和中序遍历求后序遍历和层次遍历
#include #include #include using namespace std;int maxk;string sa, sb;char dst[1000];int index[30];void init(){//initiationmaxk = 0;memset(dst, ‘^‘, sizeof(dst));memset(index, 0, sizeof(index));co
2007-05-14 22:33:00
1373
原创 浅析cin.getline,cin.get,cin.ignore,cin.clear用法
大概了解cin,cin.getline,cin.clear,cin.ignore,cin.get()的用法: cin.getline()方法连续地从用户终端接受字符,并将字符存入字符型数组message中,直到输入了(maxchars-1)个字符(第maxchars个字符用来存储字符串结尾的NULL字符/0)或者接受到了回车为止,这终端键入回车键产生一个换行/n,它被cin.getli
2007-05-14 22:33:00
1261
原创 memset用法
memest原型 (please type "man memset" in your shell) void *memset(void *s, int c, size_t n); memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。常见的三种错误第一: 搞反了c 和 n的位置. 一定要记住 如果要把一个char a
2007-05-14 22:32:00
1163
原创 字符串长度问题!(用new建立)
问题:str未被赋值时,它的长度为什么会是11呢,明明new的是一个7的数组阿?赋值后,长度又变正确了!int main(){char *str;int length,n;str = new char[7]; //分配了七个字节,但并没有赋值,也就是说,这里面是什么都 length=strlen(str); //有可能,当然也有可能是/0,但是strlen是遇到
2007-05-14 22:30:00
633
原创 关于缓冲区溢出
缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。 缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。问题随着动态分配变量而出现。为了不用太多的内存,一个有动态分配变量的程序在程序运行时才决定给他们分配多少内存。如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的地方。一个缓冲区溢出应用程序使用这个溢
2007-05-14 22:29:00
793
原创 字符串反向输出以及缓冲区分析
用一般方法实现:#include#include using namespace std;string reverseString(string s);void main(){string str;coutcin>>str;coutcout} //还未清空,输出会连在一起!!
2007-05-14 22:28:00
751
转载 typedef 用法小结
来源一:Using typedef to Curb Miscreant Code Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮。 typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写
2007-05-14 22:26:00
511
原创 swap_ranges算法(STL)
算法目的交换两个相等大小的容器内容.templatetypename ForwardIterator1, typename ForwardIterator2>ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1,
2007-05-14 22:25:00
607
原创 回溯法示例1
假设需要N个任务分配给N个工人同时去完成,每个人都能承担这N个任务,但费用不同。下面的程序用回溯法计算总费用最小的一种工作分配方案,在该方案中,为每个人分配1个不同的任务。 程序中,N个任务从0开始依次编号,N个工人也从0开始依次编号,主要的变量说明如下: c[i][j]:将任务i分配给工人j的费用。 task[i]:值为0表示任务i未分配。值为j表
2007-05-13 23:20:00
786
原创 背包问题的递归与非递归算法
背包问题的基本描述是: 有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,...,wn.希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。程序1:递归算法#include #include using namespace std;const int N=7;const int S=20;int w[N+1]={0,
2007-05-11 02:00:00
1852
1
原创 自然数拆分问题
#include#includelong res[1024],Total ;//n是需要拆分的数,m是拆分的进度。void fen(long n,long m){ long rest ; //从1开始尝试拆分。 for(long i=1;i { //拆分的数大于或等于前一个,保证不重复。(第一个是0,虚拟的,不计入结果) if(i>=re
2007-05-07 22:44:00
3715
原创 Boost初识
一直觉得STL与Boost都是很神秘并且高深的,前些天学习了下STL,有了初步的了解,发现真是个好东西,给我们编程真是带来了很大的方便。而且十分的高效,真是让我不舍得不用啊,呵呵。昨天在网上看了篇关于BOOST的一篇入门文章,收获不小,特此记录下来。Boost是什么?一套开放源代码、高度可移植的C++库。它都包括些什么内容呢?正则表达式,可以与POSIX API和Perl语言处理正
2007-04-30 15:40:00
654
原创 计算名次与按名次排序问题的算法优化
之前写过这个小算法,也没有在意,只是用for循环来一个个的比较。后来才觉得这在数据量很大的情况下会产生很多额外的开销。因此进行了优化。计算名次:进行最少次数的比较。template void Rank(T a[],int n,int r[]){for(int i=1,ir[i]=0;for(int i=1;ifor(int j=1;jif(a[j]else
2007-04-29 11:29:00
1721
1
原创 选择合适的排序函数()
为什么要选择合适的排序函数?可能你并不关心效率(这里的效率指的是程序运行时间), 或者说你的数据量很小, 因此你觉得随便用哪个函数都无关紧要。其实不然,即使你不关心效率,如果你选择合适的排序函数,你会让你的代码更容易让人明白,你会让你的代码更有扩充性,逐渐养成一个良好的习惯,很重要吧 。 如果你以前有用过C语言中的qsort, 想知道qsort和他们的比较,那我告诉你,qsort和sor
2007-04-28 23:05:00
1083
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人