C/C++
seanyxie
谢思源的个人博客
展开
-
getch() getche() getchar()的区别
1.输入输出缓冲区的概念(C++用的多一些) 我想以一个例子说明,比如我想把一篇文章以字符序列的方式输出到计算机显示器屏幕上,那么我的程序内存作为数据源而显示器驱动程序作为数据目标,如果数据源直接对数据目标发送数据的话。数据目标获得第一个字符,便将它显示。然后从端口读取下一个字符,可是这时就不能保证数据源向端口发送的恰好是第二个字符(也许是第三个,而第二个已经在数据目标显示时发送过了)。转载 2010-05-14 00:23:00 · 1163 阅读 · 0 评论 -
sizeof的用法细节
sizeof的用法sizeof的结果是预编译时候的结果。也就是说编译时候就知道了他的结果。sizeof 的操作对象可以是一个变量也可以是一个表达式,可以使一个对象或者类型名当操作对象是变量或者变量类型时候1、如果是整形,或者char型的则直接输出他的大小。2、如果是指针 int i=0; char ch[3]={'a','b','c'}; char *p=ch; cout cout cout //但是这里却可以解引用p,结果输出的原创 2010-11-18 23:07:00 · 1596 阅读 · 0 评论 -
递归方法的非递归实现
递归是一种自顶向下的方法,直到方法知道如何解决最简单的问题,递归算法需要一个线性的空间开销,并且需要不断的压栈与出栈。一般来讲,非递归算法的资源开销比递归算法低。那么,我们如何实现阶乘的非递归的算法呢?我们只需要反过来想,既然递归采用的是自顶向下的方法,那么我们非递归就可以采用自底向上的方法来实现#includeusing namespace std;int JieCheng(int num);void main(){ int num; cout>num; num=JieChen原创 2010-11-20 21:19:00 · 1996 阅读 · 0 评论 -
C++的多态
今天问到关于C++的多态性,作为面向对象的三大特性之一,这个也是很基础的,结果一时紧张,只答出来了使用虚函数来实现的多态这一点,后来面试官说还有模板呢啊,恍然大悟,回来后就多态性仔细又看了看,现在总结一下所谓多态,字面意思就是 多种状态,使用方面统一的接口来实现不同的操作,大家熟知的使用虚函数来实现的多态叫运行时的多态,此外还有静态多态,就是在编译时候就已经确立了状态关系,此外,还流传着两个多态的说法,一说是 函数多态,一说是 宏多态,下面来一一介绍一、函数多态我们想,如果要用函数来统一接口,那要怎么办,原创 2011-01-27 21:37:00 · 2012 阅读 · 0 评论 -
谈内存对齐
以前总以为内存对齐,固定的是以4个字节为单位的,今天发现原来错了...为什么要内存对齐呢 大部分的参考资料都是如是说的: 1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 首先来看一个例子#include using namespace std;原创 2011-02-09 22:41:00 · 1764 阅读 · 1 评论 -
C++运算符转换
<br /> 在C语言中,如果要转换类型转换,使用强制类型转换的方法<br />(T)expression<br />但是在C++中提供了类型转换符,分别是static_cast,dynamic_cast,reinterpret_cast,const_cast这四个类型转化符,下面一一举例来看<br /> <br />static_cast<br />用法:static_cast < type-id > ( exdivssion ) <br />该运算符把exdivssion转换为type-id类型,但没原创 2011-02-14 01:01:00 · 1555 阅读 · 0 评论 -
重载operator new与operator delete构建内存池
<br />为什么有必要写自己的operator new和operator delete?<br />答案通常是:为了效率。缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特定的场合下,可以进一步改善它的性能。尤其在那些需要动态分配大量的但很小的对象的应用程序里,情况更是如此。<br />例如有这样一个表示飞机的类:类airplane只包含一个指针,它指向的是飞机对象的实际描述(此技术在条款34进行说明):<br />class airplaner转载 2011-05-21 16:15:00 · 2555 阅读 · 0 评论 -
对象自杀 delete this
In order to understand "delete this" :First Step------dive into "delete p"delete p 执行了哪两个步骤?delete p 是一个两步的过程:调用析构函数,然后释放内存。delete p产生原创 2011-09-08 20:46:45 · 1773 阅读 · 0 评论 -
编译器链接启动代码crtexe.c
你是否想过为什么有时候main()函数是入口地址,在win32中winmain()函数又是入口地址,其实是编译器在动态链接到crt[C runtime library(part of the C standard library)]时候设置的程序设置断点,我们来看crtexe原创 2011-10-04 00:27:33 · 6408 阅读 · 0 评论 -
C++ map的基本操作和用法
查看源代码示例1、map简介map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。2、map的功能自动建立Key - value的对应。key 和 value可以是任意你需要的类型。根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10...原创 2010-08-11 18:16:00 · 75130 阅读 · 1 评论 -
图解如何使用VS2010和Qt导出和使用静态库,动态库
首先使用VS2010来导出一个DLL,该DLL种含有一个类,新建项目,如下图然后看资源管理器,在DLL导出类中添加要导出的函数或者类编辑要导出的类或者函数,如下:编译后生成DLL,名字就是工程名 "ClassDll.dll"然后新建一个工程,调用该dll,代码如下:#includeusing namespace std;#includetypedef int(*MYPROC)(int,int);void main(){ MYPROC pFunc; HMODULE原创 2011-03-01 21:05:00 · 11823 阅读 · 1 评论 -
Map以自定义类做为键值
map在STL中的定义template , class Alloc = alloc> 第一个参数Key是关键字类型第二个参数T是值类型第三个参数Compare是比较函数(仿函数)第四个参数是内存配置对象map内部存储机制实际是以红黑树为基础,红黑树在插入节点时,必须依照大小比对之后在一个合适的位置上执行插入动作。所以作为关键字,起码必须有“在选择map的关键字时,注意以下两点,同时这两点也是改错的方法:a) 关键字明确定义“b) 没有“原创 2011-04-17 16:31:00 · 18754 阅读 · 2 评论 -
dll的弱引用和强引用
先描述下dll的创建方法Test.h和Test.cpp#pragma once#ifdef __COMMON#define __COMMON_EXPORT __declspec(dllexport)#else#define __COMMON_EXPORT __declspec(dllimport)#endif extern "C" __COMMON_EXPO原创 2013-02-26 19:31:33 · 1713 阅读 · 0 评论 -
C++软件开发第三方库大全
1.boost 这个使用的人多不多说了2.pthread windows下的posix线程实现3.libcurl 一个有名的开源网络爬虫库 阿里旺旺中使用到了4.libeay32 OpenSSL Library5.libtidy 一个专门解析htm的库6.zlib 这个鬼都知道7.freetype c接口的type2字体处理库8.libmad 一个编解码mp3的库9.libo...转载 2011-11-29 22:16:47 · 3993 阅读 · 1 评论 -
函数可变参数
#include#includeusing namespace std;// 求若干数的平方和//第一个参数是参数的个数double pingfangsum(int a,...){ double sum = 0,num; va_list var_arg; //定义一个指向个数可变的参数列表指针; va_start(var_arg,a); //使参数列表指针arg_ptr原创 2012-02-03 13:51:06 · 1520 阅读 · 0 评论 -
dll导出的真正含义
__declspec(dllexport)修饰符,编译器在检测到时候,会在生成的.obj中潜入yi'ge'xi原创 2014-05-26 19:33:31 · 1272 阅读 · 0 评论 -
远程线程注入dll
// CommonInject.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include #include #include using namespace std;#include #pragma comment(li原创 2014-06-04 16:46:52 · 1811 阅读 · 0 评论 -
如此写法
<br />今天突然发现C++语言还可以这样写<br />看下面的例子<br />char ch="hello,QT"[1];<br />结果ch='e'<br /> <br />真失败....第一次见到这样的写法原创 2010-11-08 22:35:00 · 1385 阅读 · 0 评论 -
动态申请内存的危险处
<br />C++的new给用户动态申请内存带来了很大的方便,但是也带来了一些危险<br />一不小心就会造成内存泄露<br />char *pa=new char[5];然后如果修改了pa指针pa++;或者pa="abcde";<br />这样就导致pa的指向改变,然后delete []pa时候就会错误,导致内存无法回收<br />所以要慎重<br /> <br />后来想如果new返回的是指针常量<br />这样就无法修改指针的指向就无法修改<br />但是申明*pa为const时候,发现s原创 2010-11-10 13:47:00 · 1198 阅读 · 0 评论 -
数组名和字符指针的不同
数组名和字符指针可以相互装换,但是他们二者在使用上却有不同之处: //=======第一个不同,指针可以相互赋值,但是数组名却不可以// 数组名作为数组中第一个元素的地址,其地址也是一个地址,但是字符指针是另外单独开辟的一个空间,指向一个内存单元,//因此数组名的地址是固定,自然不能相互赋值了 char *s1="abc"; char *s2="efg"; ch原创 2010-05-16 16:28:00 · 1242 阅读 · 0 评论 -
snprintf()和sprintf()格式化字符串
int snprintf(char *str, size_t size, const char *format, ...);将可变个参数(...)按照format格式化成字符串,然后将其复制到str中 (1) 如果格式化后的字符串长度 (2) 如果格式化后的字符串长度 => size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('/0') 函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。 -----------------------------转载 2010-07-13 15:05:00 · 7409 阅读 · 0 评论 -
复合运算表达式使用的注意
大家熟悉的i+=1和i=i+1 除了前者的执行效率比后者快之外,在使用中是否注意到这样一个问题,i+=1实际上I被运算了一次,而i=i+1则被预算了两次如果单一对i求值的话并没有影响,但是如果i里面包含了表达式,那结果可就不一样了看下面的例子#includeint fun(int i){ printf("i=%d/n",i); return i;}main(){ int a[5]={1,2,3,原创 2010-05-19 17:33:00 · 1087 阅读 · 0 评论 -
字符型指针分配对内存
函数中定义int *p,char *ch;这两个是分配在栈中的,现在要为他们分配对内存空间,然后查看分配的堆内存地址cout但是cout现在如果想查看ch所指向的堆内存地址要进行指针类型转换使用下面来处理int *pa=reinterpret_cast(ch);cout原创 2010-05-24 17:39:00 · 1279 阅读 · 0 评论 -
利用容器来拆分字符串
一个string str="xie si yuan" 如果想拆分这个字符串,就是中间有空格的话就拆分,也对vector容器和迭代器有一个稍微的了解来看源代码#include #include #include #include using namespace std; vector division_word(const string &str); int main() { st原创 2010-05-23 21:54:00 · 1497 阅读 · 0 评论 -
内存对齐
在定义结构体时候,系统为结构体分配内存,是按照四个字节为单位进行分配的,要注意内存对齐的问题这样可以节省存储空间class t1{ int i; char ch1; char ch2;};class t2{ char ch1; int i; char ch2;} ; class t3{ char ch1; char ch2;原创 2010-05-24 17:43:00 · 1139 阅读 · 0 评论 -
CString中的TrimLeft()和TrimRight()的用法----对比isspace()
一个CString字符串,如果在字符串的开始或结尾有空格的时候,可以使用TrimRight()和TrimLeft()来消去空格,例如CString str=" xiesiyuan ";CString str1;CString str2; str1=str;str.TrimLeft();str2=str;这时候我们刷新窗口,会发现str1=" xiesi原创 2010-05-27 18:18:00 · 10184 阅读 · 0 评论 -
C语言里的静态函数
<br />静态变量我们和熟悉,是定义在静态存储区的数据,每次修改后可以保持数值的不变<br />但是定义静态函数的作用是什么呢?<br />定义了静态函数后,外部文件无法使用该函数了,同样的是定义静态变量后,外部文件同样不能使用<br />在工程中,通常各个模块分开完成,这时候如果确定自己定义的函数别的文件不会使用,就可以加上static,<br />以保证不会被误用<br />例如:<br />file1.c<br /> <br />#include<stdio.h><br />static int a原创 2010-06-14 10:29:00 · 1518 阅读 · 0 评论 -
实现atoi,itoa,strcmp,strcpy,strcat,strlen函数
#includeusing namespace std;void myitoa(const int num,char *ch);int myatoi(const char *ch);void mystrcpy(char* dest,const char* source);int mystrcmp(char *source1,char*source2);void mystrcat(char *dest,char *source);int mystrlen(char *ch);void main(){ int原创 2010-09-03 00:43:00 · 1613 阅读 · 0 评论 -
修改const常量的方法
<br />看到这个标题,你也许会说,我不懂const, 因为Const修饰的是不可变得变量,他的值是不能修改的。没错,const修改的值的确不能修改,但是也有条件,条件就是编译不能通过,const是一个编译时期常量。如果我能在绕过编译器,通过编译后,我仍然可以修改const的值。<br /> 分C/C++两种情况讨论:<br /> 一 C语言:<br /> const long lng=10;<br /> long *pl=(long)&lng;<br /> *pl=10转载 2010-10-12 22:45:00 · 3028 阅读 · 2 评论 -
C++的重写,重载,重定义
1. 重写 (override): 父类与子类之间的多态性。子类重新定义父类中有相同名称和参数的虚函数。1) 被重写的函数不能是 static 的。必须是 virtual 的,或者是 override 的 ( 即函数在最原始的基类中被声明为 virtual , c++ 中没有 override) 。2) 重写函数必须有相同的类型,名称和参数列表 (即相同的函数原型)3) 重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected原创 2010-12-03 15:08:00 · 8176 阅读 · 0 评论 -
C++的虚伪
<br />虚基类<br /> 当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为 <br />虚基类<br />虚基类. <br /> 在继承中产生歧义的原因有可能基类是继承类继承了基类多次,从而产生了多个拷贝,即不止一次的通过多个路径继承类在内存中创建了基类成员的多份拷贝。虚的基本原则是在内存中只有基类成员的一份拷贝。这样,通过把基类继承声明为虚拟的,就只能继承基类的一份拷贝,从而消除原创 2010-12-11 01:03:00 · 1447 阅读 · 0 评论 -
C++中虚函数的原理和虚函数表
一, 什么是虚函数简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略,虚函数是C++的多态性的主要体现,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。下面我们从这段代码中来进行分析:#includeusing namespace std;class A{ publ原创 2010-10-25 16:02:00 · 2931 阅读 · 0 评论 -
使用指针在类外修改类的私有变量
<br />类的私有变量在类外是不能访问的,但是这种保护机制仅仅是在编译器编译阶段来检查的,和const是一样,通过指针,我们还是可以访问并且修改的,因为一个类的对象仅仅包括自己的成员数据,所有的成员函数和静态成员变量都是一个实体,该类的所有对象共享这个实体,因此对象的长度是该类所有auto变量的长度,如果该类或者其基类有虚函数,生成的对象还要加上虚函数表的指针的大小,就是vptr的大小,4个字节。关于虚函数和虚函数表,可以参看http://blog.csdn.net/xie376450483/archiv原创 2010-10-26 12:54:00 · 2670 阅读 · 0 评论 -
类成员变量和成员函数的地址
<br />class 指向成员函数的指针必须与向其赋值的函数类型匹配不是两个而是三个方面都要匹配参数的类型和个数 返回类型 它所属的类类型<br />做下面的一个测试<br />#include<iostream>using namespace std;class A{public: A(int); void fun1(); virtual void fun2(); static void fun3(); int num1; static int num2;};原创 2010-10-26 09:51:00 · 3679 阅读 · 3 评论 -
对数组名取地址
<br />int a[5]={1,2,3,4,5};<br />int b[100];<br />一个数组名代表的是数组中第一个元素的位置,通过数组名我们可以访问数组,先看下面两个问题<br />问题一:<br />看到一篇文章这么写的。。<br />int array[10]; <br />int (*ptr)[10]; <br />ptr=&array;//这里说明&array是指向数组的指针,但为什么&array是指向数组的指针? <br />答一:<br />对数组名取地址在C标准里面是未定义的行原创 2010-10-26 19:50:00 · 7709 阅读 · 3 评论 -
C++编码规范
命名规范通用命名规则类型名类型名(类、结极体、类型定义(typedef)、枚举)以大写字母开始并混合大小写,如Line, SavingsAccount变量名变量名必须以小写字母开始并混合大小写, 如line, savingsAccount函数名函数名必须以小写字母的动词开始并混合大小写,如:getName(), c原创 2014-10-19 20:04:36 · 2052 阅读 · 1 评论