C++基础学习
lsmdiao0812
这个作者很懒,什么都没留下…
展开
-
用模板做的队列
//练兵--希望各位评论const int size=100;template class Queue{ int front; int back; Type a[size];public: Queue(); void EnQueue(Type ); Type DeQueue(); bool IsEmpty(); bool IsFull(); void Print(); void Exit(co原创 2008-03-26 10:36:00 · 449 阅读 · 0 评论 -
线程安全的对象操作
CRITICAL_SECTION cs;//全局临界区 class Lock//加-解锁 {public: Lock() { EnterCriticalSection(&cs); } ~Lock() { LeaveCriticalSection(&cs); }};原创 2008-11-17 15:26:00 · 813 阅读 · 0 评论 -
重载new和delete运算符
在C++中可以重载new和delete运算符,重载new时注意参数须设置为size_t,当然UINT也可以,其他的如WORD,DWORD都不行;重载delete是参数应设为void *。下面是一个例子,还模拟了构造函数与new的执行顺序:// 重载newdelete.cpp : main project file. #include "stdafx.h" #include原创 2008-11-19 10:40:00 · 2896 阅读 · 0 评论 -
大小端模式
所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; r( ~dLm, 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数 据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低转载 2008-11-24 15:58:00 · 929 阅读 · 0 评论 -
单字节/宽字节下的strlen,sizeof,lstrlen
宽字节(unicode)下,一个字符占两个字节,所以: char ch1[] = "123"; TCHAR ch2[8] = TEXT("123"); cout sizeof(ch1) cout cout sizeof(ch2) cout 输出:4 3 16 3当然,最后那个字符串结束标记‘/0’原创 2008-11-27 14:26:00 · 3503 阅读 · 0 评论 -
C++中的##使用
##用于连接两个字符串,如:#define DEF(t) "str"##t int main(array ^args){ char ch[] = DEF("123"); cout getchar(); return 0;} 返回:str123 但,下面会提示编译错误:#define DEF(t)原创 2008-11-27 14:41:00 · 740 阅读 · 0 评论 -
Switch接受的类型
在C++中,Switch只接受整数类型,像char,int,short,long等,但string,float,double等就不支持,否则编译会出错: string d = "1"; switch (d) { case "1": cout "sd1" break; case "2":原创 2008-11-27 14:22:00 · 1125 阅读 · 0 评论 -
关闭编译时的警告
编译程序时会出现各种警告,软件发布时须关闭1 C++从大范围的书转为小范围的数时就会有警告信息,如: int i = 10; double d = 10.2; i = d + i; cout 改为下面就好了: int i = 10; double d = 10.2; i = (int)d + i; cout原创 2008-11-27 14:13:00 · 892 阅读 · 0 评论 -
原码、反码和补码
在计算机内,定点数有3种表示法:原码、反码和补码所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。1、原码、反码和补码的表示方法(1) 原码:在数值前转载 2009-08-15 13:53:00 · 1255 阅读 · 0 评论 -
不同种类的整型比较,到底发生了什么?
看这么两行代码:int i = -1;cout 在VC6.0下,永远输出0。而下面这两行代码也永远输出0int i = 255;cout 而实际上,以上两个代码中,char(i)和unsigned char(i)具有的内存布局都是完全相同的。由于整型之间的类型转换遵循这样的原则:当目标类型比原类型短的时候,直接截断原类型。而当目标类型较长,则无符号类型会直接在高位补0,有符号类型在高位补符号位。转载 2009-08-15 13:55:00 · 982 阅读 · 0 评论 -
STL中用erase()方法遍历删除元素
http://www.cppblog.com/Herbert/archive/2009/01/08/70479.html STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。 在使用 list、set 或 map转载 2009-08-23 10:10:00 · 5769 阅读 · 0 评论 -
STL:循环删除容器中元素的方法和陷阱
算法大师Donald Knuth:不成熟的优化是一切恶果的根源(Permature optimization is the root of all evil )。 STL中的容器主要是两种:序列式容器和关联式容器。下面讲到的都是我在开发中曾经遇到过的一些问题,有些例子我做了修改,我想初学STL的人基本都会遇到这些问题。序列式容器:vector list string等等关联式容转载 2009-08-23 09:25:00 · 1002 阅读 · 0 评论 -
堆与栈
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。转载 2008-10-28 18:04:00 · 900 阅读 · 0 评论 -
关闭 C4996 警告
在使用VC 2005 的开发者会遇到这样的问题,在使用std命名空间库函数的时候,往往会出现类似于下面的警告: warning C4996: strcpy was declared deprecated 出现这样的警告,是因为VC2005中认为CRT中的一组函数如果使用不当,可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如:strcpy、s转载 2008-10-28 10:01:00 · 2076 阅读 · 1 评论 -
用结构做的栈
#define size 50typedef struct STACK{ int top; int *a;}Stack;void Init(Stack &stack)//初始话{ stack.a=(int*)malloc(size*sizeof(int)); stack.top=-1;}void Push(Stack &stack,int data)//入栈{ if(stack.top原创 2008-03-28 10:11:00 · 372 阅读 · 0 评论 -
strlen使用要小心
strlen 的原形是: size_t strlen(const char &),其中size_t是stddef.h中定义的无符号整数,看下列输出:int main(array ^args){ char *str1="12"; char *str2="123"; if(strlen(str1)-strlen(str2) printf("Not Show"); printf("Show");原创 2008-03-27 09:20:00 · 559 阅读 · 0 评论 -
插入排序
class CRSort{ int size; int *a;public: CRSort() { size=5; a=new int[5]; a[0]=5;a[1]=2;a[2]=6;a[3]=7;a[4]=3; } void Sort(); void Print()const; };void CRSort::Sort(){ int data; int h; for(int原创 2008-04-01 15:49:00 · 395 阅读 · 0 评论 -
c/c++ 中++/--
int i = 5; j = --i + i++; //or j = (--i) + (i++);正确答案应该是:没有正确答案。根据编译器的不同,有不同结果。解释:参考Bjarne Stroustrup 《C++程序设计语言》(特别版)(裘宗燕 译)P110中的第6.2.2节,关于表达式的求值顺序的说明。原文:在一个表达式里,子表达式的求值顺序是没有定义的。特转载 2008-04-09 15:51:00 · 486 阅读 · 0 评论 -
c++学习
1、一元运算符和赋值运算符是右结合的,其它的运算符都是左结合的。所以,a=b=c的意思是a=(b=c),a+b+c是(a+b)+c2、左值:左值是引用某个“存储器中的区域”的表达式,一个左值必定能取到它的地址 [code=c/c++] int* p = &++x; // ok int* q = &(x++); // error: x++不是一个左值,不存在表示x++的地址单元,x++参转载 2008-04-09 16:18:00 · 495 阅读 · 0 评论 -
排序(如12,3,45,2,74。结果为:12,2,3,45,74)
bool Compare(int ,int );void QSSort(int *arr,int beg,int end){ int temp=arr[beg]; int i=beg; int j=end; while(i { while(i j--; if(i { arr[i]=arr[j]; i++; } while(i i++; if(i { a原创 2008-04-24 12:57:00 · 458 阅读 · 0 评论 -
指针与引用
相同点:都是让你间接引用其他对象 不同点:1 引用必须指向一个值,而指针可以指向空值。所以,如果你的程序允许你变量指向一个空对象,就使用指针;如果不允许变量指向空值,就使用引用。如: int *i=0; int &j=*i; cout是危险的,用VS2005调试,编译可以通过,但是运行时导致程序崩溃。 2 根据以上原因,引用必须初始化,而指针不是必须的。原创 2008-09-24 09:50:00 · 509 阅读 · 0 评论 -
函数指针
class A{public: void Print1() { cout } void Print2() { cout }};class B{public: typedef void (A::*fun)(); B(A a) { fun f=&A::Print1; (a.*f)(); }};int main(array ^args){ A a; B *b=new B(a);原创 2008-09-25 12:32:00 · 454 阅读 · 0 评论 -
C++虚函数
有虚函数的类,编译器会创建一张虚函数表,类的实例会通过一个指针指向这个虚函数表:class A{public: A(){} virtual void Print() { cout"A" }};class B : public A{public: B(){} void Print(原创 2008-10-20 13:22:00 · 462 阅读 · 0 评论 -
deque/vector的插入
deque/vector与list不同,他是基于数组形式的,即所有元素都放在一片连续的内存中,所以插入元素后,可能放入另外的一片内存中,迭代器就会失效,所以要注意: deque d; d.push_back(5); d.push_back(6); d.push_back(8); d.push_back(9); deque::iterator it=d.begin(); int i=1; w原创 2008-09-25 10:11:00 · 626 阅读 · 0 评论 -
const的一个问题
今天写程序,出了一个小问题:struct Test{ int Msgtype; int szMsg[];};class A{ Test t;public: Test GetT()const//注意这行的变化 { return t; }};int main(array ^a原创 2008-10-22 15:59:00 · 503 阅读 · 0 评论 -
vector 使用at 和 []访问元素
1 使用at,如果不存在,则会抛出C++异常,可以使用异常机制捕获vector vecvec.push_back(1);try{ int i = vec.at(2);}catch(...){ cout } 2 使用【】直接抛错(vc编译器)原创 2009-08-24 10:15:00 · 3588 阅读 · 0 评论