摘要: variant_t 到 CString 转换数据类型转换函数CString CZjyDlg::VariantToString(VARIANT var){CString strValue; _variant_t var_t; _bstr_t bstr_t; time_t cur_time; CTime time_value; COleCurrency var_currency; switch(var.vt) { case VT_EMPTY: case VT_NULL:strValue=_T("");break; case VT_UI1:strValue.Format(&quo 阅读全文
posted @ 2012-09-11 09:27 CBDoctor 阅读(2289) 评论(0) 推荐(0)
摘要: CString LPCTSTR区别联系 CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。LP的含义是长指针(long pointe 阅读全文
posted @ 2012-09-11 08:13 CBDoctor 阅读(36990) 评论(2) 推荐(1)
摘要: CString->std::string 例子:CString strMfc=“test“;std::string strStl;strStl=strMfc.GetBuffer(0);std::string->CString 例子:CString strMfc;std::string strStl=“test“;strMfc=strStl.c_str();std::string ->char*例子:string str;char* p;p = str.c_str(); 阅读全文
posted @ 2012-09-04 20:41 CBDoctor 阅读(491) 评论(0) 推荐(0)
摘要: visual C++提供了多种多样的数据库访问技术——ODBC API、MFC ODBC、MFC DAO(面向对象)、MFC OLEDB、和ADO等,这些技术各有自己的特点。为了解决ODBC开发的数据库应用程序访问数据库速度慢的问题,visual C++提供了新的访问技术——OLEDB和ADO。OLEDB和ADO都是基于COM接口技术,可以直接对数据库的驱动程序进行访问,大大提高了访问的速度。ODBC API技术又叫开放数据库连接,它提供了一个通用的编程接口,允许程序与不同的数据库进行连接,用户可以使用SQL语句对数据库进行直接的底层的操作。在使用ODBC API时,用户需要引入的文件为&qu 阅读全文
posted @ 2012-09-04 08:23 CBDoctor 阅读(2556) 评论(0) 推荐(0)
摘要: 1. 字符是有符号数还是无符号数?有符号字符整数的取值范围为-128~127,无符号字符整数的取值范围为0~255我们在将有符号数转为无符号数时常犯的一个错误为(unsigned) p ;正确的解答方法为:(unsigned char) p;----------------------------------2. 移位运算符 程序设计中,位操作运算符的一种。在c++中,移位运算符有双目移位运算符:<<(左移)和>>(右移)。移位运算符组成的表达式也属于算术表达式,其值为算术值。左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。右 阅读全文
posted @ 2012-09-01 22:33 CBDoctor 阅读(225) 评论(0) 推荐(0)
摘要: 部分内容来自作者JuKevin1. const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变。例如:const int nValue; //nValue是constint const nValue; // nValue是const但是对于指针类型的TYPE,不同的写法会有不同情况,例如:A. const char *pContent;B. cha. 阅读全文
posted @ 2012-08-30 23:52 CBDoctor 阅读(963) 评论(0) 推荐(0)
摘要: http://blog.csdn.net/anye3000/article/details/6578262#include <iostream>using namespace std; void main(){ int a = 10; int **pTest = new int*; int *pSec = &a; pTest = &pSec; *pTest = pSec; cout<<*pTest<<endl; cout<<pSec<<endl; cout<<**pTest<<endl; //修 阅读全文
posted @ 2012-08-23 23:43 CBDoctor 阅读(456) 评论(0) 推荐(0)
摘要: 在《程序员面试宝典》有这样一道题目:#include <iostream>#include <string> using namespace std;int _tmain(int argc, _TCHAR* argv[]){ float fa = 1.0f; cout<<&fa<<endl; //0x0012ff60 cout<<(int)fa<<endl; //1 cout<<(float&)fa<<endl;//1 cout<<*((float*)(&fa)) 阅读全文
posted @ 2012-08-19 10:04 CBDoctor 阅读(13307) 评论(1) 推荐(3)
摘要: static在C++中分为两种:(1)static变量(2)static函数在这之前,我们先弄清楚变量的几个存储空间http://www.cnblogs.com/cbdoctor/archive/2011/12/24/2300624.htmlstatic和全局变量都是分配在全局/静态存储区域一、面向过程的static1、静态全局变量:在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下://Example 1#include void fn();static int n; //定义静态全局变量void main(){ n=20; cou 阅读全文
posted @ 2012-08-18 01:36 CBDoctor 阅读(498) 评论(0) 推荐(0)
摘要: 今天打开自己以前写代码突然觉得在main函数中如果要用的很多自己实现的函数,如果把它们都放在main.cpp文件中太臃肿了。调试起来特别不方便。能不能把这些自己实现的函数放到另外一个文件中呢? 可是又不能把这些函数放在.h文件中。因为书上说.h文件中最好只放结构体、类等的申明,函数实现最好放在.cpp文件中。好吧那我就把这些函数放到一个.cpp文件中吧。所以我就新建了一个2.cpp文件把自己实现的函数都放在里面。然后把这个2.cpp文件放在和main.cpp文件的同目录下。在main.cpp中#include"2.cpp".重新编译运行,一切正常。看似成功了。关掉这个工程后 阅读全文
posted @ 2012-08-18 00:34 CBDoctor 阅读(5467) 评论(2) 推荐(5)
摘要: externinta 表示a是在其它文件中定义的一个变量,需要在这里引用。a已在别的文件中,所以不需要再分配空间了。externinta 定义的a变量表示该变量在使用前已经定义了!一般有两种情况,一是该变量是在其他的文件中定义的全局变量,简称 外部变量。第二种情况表示变量在本文件中定义的全局变量... 阅读全文
posted @ 2012-08-18 00:15 CBDoctor 阅读(372) 评论(0) 推荐(0)
摘要: int *a;*a = 10;这是C初学者很容易犯的一个错误。我们定义了一个指针变量a, 它存储的是某一个整型变量的地址,然而,我们并没有把该地址赋值给它,紧接着,我们将一个常量10赋给指针变量a所存储的地址所指向的值,然而实际上,我们并没有给该指针变量赋值,因此,幸运的情况是系统的崩溃,严重的错误是指针变量a被分配了一个合法的地址,然后,该地址所指向的值被改变。如上图所示:int m1 = 4; //定义一个变量m1,它存储的内容为4int m2 = 12;int m3 = 0;int *a; //定义一个指针变量a,它存储的内容是某一个整形变量的地址a = &m1; //将m1所代 阅读全文
posted @ 2012-08-13 23:29 CBDoctor 阅读(183) 评论(0) 推荐(0)
摘要: 函数的覆盖(overlap)是指子类重新定义父类的虚函数的做法,会用到关键字“Virtual",而函数重载(overload)是通过函数参数、函数返回类型等的不同来实现的。 对重载函数而言,对于函数的调用,是静态的,也就是说,他们的地址在编译期间就已经绑定了,因此,重载和多态无关。真正与多态相关的是覆盖,子类重新定义了父类的虚函数后,父类指针根据赋予它的不同的子类指针,动态的调用属于子类的该函数,这样的函数在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期间绑定的(晚绑定)。结论就是重载只是一种语言特征,与多态无关,与面向对象也无关。 阅读全文
posted @ 2012-08-13 20:58 CBDoctor 阅读(626) 评论(0) 推荐(0)
摘要: 首先给出MSDN上一段设置阻塞超时的代码:(网址为http://social.msdn.microsoft.com/Forums/zh-SG/visualcpluszhchs/thread/3d9daec0-f000-4bf1-add1-3beab8e398eb)您可以利用select模型来设置connect连接超时,当前之前需要调用unsigned long ul = 1;ioctlsocket(SOCKET, FIOBIO, (unsigned long*)&ul);。。。connect(...);之后的就使用select()下面有段网上的例子代码,您不妨参考一下:WSADATA 阅读全文
posted @ 2012-08-12 11:19 CBDoctor 阅读(9781) 评论(0) 推荐(0)
摘要: 面向对象的编程是基于3个基本的概念:1.数据抽象 2.多态 3. 动态绑定什么是数据抽象呢?数据抽象隐藏了所描述对象的内部特征,对于外部环境而言是透明的。而外部环境只有通过使用该对象所提供的操作来表现对象的动态特征。很容易理解,其实就是类似于动态库,我们只是知道有这样的一个函数,知道他的各个参数,知道他的功能,但是具体内部怎样实现的,我们却不知道。再举个通俗的例子,你只要给我1000元钱,我就给你买件漂亮的服装,你不用管我是怎样买的,你只要给我钱就行,这里所谓的钱,也就是类中所封装起来的成员。多态是什么呢?其实就是继承,那继承的作用是什么呢?再举个简单的例子:有一个父亲(类),小眼睛、平头(相 阅读全文
posted @ 2012-08-11 00:35 CBDoctor 阅读(625) 评论(0) 推荐(0)
摘要: //C++整形转化为字符串#include <iostream>#include "stdio.h"#include<string.h>#include <assert.h>using namespace std;/*编写一个比较安全的字符拷贝函数*/char* stringCopy(char* dst, const char * src){ char *temp; temp = dst; assert(dst!= NULL && src!= NULL); while(*src != '\0') { *ds 阅读全文
posted @ 2012-08-09 22:14 CBDoctor 阅读(240) 评论(0) 推荐(0)
摘要: 一、为什么使用操作符重载?对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义的class,如果想支持基本操作,比如比较大小,判断是否相等,等等,则需要用户自己来定义关于这个操作符的具体实现。比如,判断两个人是否一样大,我们默认的规则是按照其年龄来比较,所以,在设计person 这个class的时候,我们需要考虑操作符==,而且,根据刚才的分析,比较的依据应该是age。那么为什么叫重载呢?这是因为,在编译器实现的时候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了用户定义的数据类型class,所以,需要用户自己来提供该参数 阅读全文
posted @ 2012-08-09 10:40 CBDoctor 阅读(4446) 评论(0) 推荐(0)
摘要: //C++ 排序方法的总结#include <iostream>#include <vector>using namespace std;/*采用插入法进行排序*/void InsertArray(int a[],int n, int* &b){ int temp; int j; for(int i = 0;i<n-1;i++) { j = i; while(a[j]>a[j+1]) //后者小于前者,交换 { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; if(j>0) { j--; } } } b = 阅读全文
posted @ 2012-08-08 15:41 CBDoctor 阅读(209) 评论(0) 推荐(0)
摘要: //C++ 对列的基本预算#include <iostream>using namespace std;typedef struct node{ int data; struct node *next;}node;typedef struct quene{ node *head; node *end;}quene;/*创建一个空链式队列*/int Create(struct quene *s){ s->head = (node*)malloc(sizeof(node));//申请头节点 if (s->head == NULL) { cout<<"I 阅读全文
posted @ 2012-08-06 22:17 CBDoctor 阅读(260) 评论(0) 推荐(0)
摘要: http://blacksnow.blog.51cto.com/265898/162216/http://www.cnblogs.com/Clingingboy/archive/2011/03/20/1989752.htmlhttp://blog.csdn.net/wanhui520/article/details/7021180 阅读全文
posted @ 2012-08-06 16:49 CBDoctor 阅读(143) 评论(0) 推荐(0)
摘要: //C++对双链表的操作#include <iostream>using namespace std;typedef struct node{ int data; struct node *left; struct node *right;}node;typedef struct single{ int data; struct single *next;}single;/*创建一个双链表*/node* Create(){ struct node *head; struct node *p; struct node *s; head = (node*)malloc(sizeof(n 阅读全文
posted @ 2012-08-05 19:50 CBDoctor 阅读(196) 评论(0) 推荐(0)
摘要: // 22.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <time.h>using namespace std;struct node{ int data; int x; int y; int nx; int ny;}node[45];int _tmain(int argc, _TCHAR* argv[]){ const int NUM = 10; //定义点对的数目 int array[2][NUM]; const int n = NUM*(NUM-1)/ 阅读全文
posted @ 2012-08-05 11:12 CBDoctor 阅读(378) 评论(0) 推荐(0)
摘要: //vector#include <iostream>#include <vector>#include <time.h>using namespace std;void func1(int array[], int n,int &max,int&min){ max = array[0]; min = array[0]; // for(int i = 0;i<n;i++) { if(max<array[i]) max= array[i]; if(min>array[i]) min = array[i]; }}//C++向量的 阅读全文
posted @ 2012-08-04 21:29 CBDoctor 阅读(308) 评论(0) 推荐(0)
摘要: /*构造一个带头节点的空链表1.1为单链表的指针、头指针可以标志一个确定的单链表,算法中1前的"&"表示该变量是指针的指针的类型,实现时用*表示*/#include <iostream>using namespace std;/*描述一个单链表*/typedef struct node{ int data; //定义存储整形数据 struct node *next; //定义存储下一个数据位置的指针}node, *linkList;/*首先初始化一个链表*/int Initlist (linkList &a){ if ( (a = (node*) 阅读全文
posted @ 2012-08-04 20:10 CBDoctor 阅读(331) 评论(0) 推荐(0)
摘要: Fibonacci数列是一个非常美丽的数列,他的递推公式为:f(n) = 0 n = 0= 1n = 1 = f(n-1)+f(n-2) n>1---------------------------------------代码如下:#include <iostream>using namespace std;int fibonacci(int n){ if(n== 1 || n==0) { return n; } if(n>1) { return (fibonacci(n-1)+fibonacci(n-2)); }}void main(){ int mResult=fi 阅读全文
posted @ 2012-08-03 10:57 CBDoctor 阅读(195) 评论(0) 推荐(0)
摘要: 问题:给定一个长度为N 的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。----------------------------------------看到这个题目,我的第一感觉是只要找到该数组中最小的数,然后排除这个数不就可以吗?但是问题是如果数据都是正数还好,上面的办法可以实现,但是如果有负数,问题就比较难办。我们采用最基本的方法,就是把任意的N-1个数抽取,然后有N次这样的组合,算法的时间复杂度为:O(N^2)我们可以很快的写出代码:#include <iostream>using namespace std;voi 阅读全文
posted @ 2012-08-03 00:21 CBDoctor 阅读(311) 评论(0) 推荐(0)
摘要: 通过调用setsockopt函数http://hi.baidu.com/qhh_2008/item/b3544b36d552dcd06c15e91bhttp://www.360doc.com/content/12/0211/16/1317564_185797704.shtml 阅读全文
posted @ 2012-08-01 22:20 CBDoctor 阅读(1250) 评论(0) 推荐(0)
摘要: 任何一个无限循环小数或有限小数都可以表示为分数的形式。(1)有限小数假设为a.b1b2b3b4b5我们可以表示为:a+(b1b2b3b4b5)/10^5;(2)无限循环小数假设为a.b1b2b3b4b5b6(c1c2c3c4)a.b1b2b3b4b5b6(c1c2c3c4) = ab1b2b3b4b5b6.(c1c2c3c4)/10^6; (1)另ab1b2b3b4b5b6 = X; 0.c1c2c3c4 =Y;对Y而言:0.(c1c2c3c4)= Y;0.(c1c2c3c4) = c1c2c3c4.(c1c2c3c4)/10^4即:Y×10^4= c1c2c3c4+Y;所以:Y = 阅读全文
posted @ 2012-08-01 16:31 CBDoctor 阅读(296) 评论(0) 推荐(0)
摘要: C中的野指针,C++中的迷途指针(失控指针或悬浮指针)都是不为NULL的指针,也不是指向常量的指针,而是指向“垃圾”内存的指针。“垃圾”的意思是未知区域、未知内存。例如,当我们定义一个指针的时候:void main(){ int *p;}p的值为0xcccccccc。也就是说,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱 指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。这也就是为什么我们在指针一开始创建时就给它赋一个值总是没有错的。 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指. 阅读全文
posted @ 2012-08-01 14:05 CBDoctor 阅读(2177) 评论(2) 推荐(1)
摘要: #include <iostream>#include <windows.h>#include "stdlib.h"#include "time.h"using namespace std;void func(int a[], int n, int K, int (&max)[2]);void main(){ srand(time(0)); int a[10]; int array[2]; for (int i = 0;i<10;i++) { a[i]= rand(); } func(a, 10, 2,array); 阅读全文
posted @ 2012-07-31 15:00 CBDoctor 阅读(209) 评论(0) 推荐(0)
摘要: 代码:#include <iostream>using namespace std;void main(){ int a = 12; int num = 0; while(1) { if(a!=0) { num++; a = a & (a-1); } else break; } cout<<num<<endl; }给定另一个正整数A、B。问你把A变为B需要改变多少为?#include <iostream>#include <windows.h>using namespace std;void main(){ int a = 1 阅读全文
posted @ 2012-07-31 13:38 CBDoctor 阅读(162) 评论(0) 推荐(0)
摘要: 二维数组和指向指针的指针一道面试题引发的问题,首先要知道[]的优先级高于*,题目:char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?直接用程序说明:#include<stdio.h>void main(){ char **p,a[6][8]; p = a; printf("\n");}编译,然后就会发现通不过,报错:错误1error C2440: “=”: 无法从“char [6][8]”转换为“char **”《C专家编程》里10.5节—使用指针向函数传递一个多维数组。方法一,函数是 void fun(int arr[2][3] 阅读全文
posted @ 2012-07-31 10:16 CBDoctor 阅读(731) 评论(0) 推荐(0)
摘要: 24点游戏的解决办法,也是采取穷举法的思路,4个数,有4!=24中排列的方法,然后3个操作符号,有4×4×4 = 64种结果,再加上括号,有5种结果,于是,每4个数有24*66*5 = 7680中结果。为了简便计算,原书中给出的第一种方法采取这样一种递归的思路: 1 /* 2 <编程之美> 3 深搜 4 遍历运算符, 数和括号的所有排列形式 5 */ 6 #include <iostream> 7 #include <string> 8 #include <math.h> 9 10 using namespace std; 1 阅读全文
posted @ 2012-07-30 11:47 CBDoctor 阅读(460) 评论(0) 推荐(0)
摘要: 如何将二维数组作为函数的参数传递 今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。正文: 首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下(略有改变,请原谅): [原文开始] 可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: void Func(int array[3][10]); void 阅读全文
posted @ 2012-07-29 15:46 CBDoctor 阅读(21107) 评论(1) 推荐(0)
摘要: 编程之美讲了2中构造数独的方法,参照网上已有的代码,整理了一下。第一种:回溯法 1 #include <iostream> 2 #include "stdlib.h" 3 #include <time.h> 4 5 #define LEN 9 6 7 using namespace std; 8 9 int CheckData(int array[][LEN],int i,int j)10 {11 int temp = array[i][j];12 int p, q;13 int m, n;14 15 for(p=0; p<9; p++)16 阅读全文
posted @ 2012-07-29 12:31 CBDoctor 阅读(325) 评论(0) 推荐(0)
摘要: http://blog.21ic.com/user1/5982/archives/2011/81660.html 阅读全文
posted @ 2012-07-22 23:22 CBDoctor 阅读(262) 评论(0) 推荐(0)
摘要: static和const都是C++中比较麻烦的东西,只要是太容易混淆他们的作用,之前对static做过点总结,但是不全面,还有很多小的错误,现在整理一下:变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。------------------------------------------------------------------------------------『维基百科』给出如下定义“静态变量”这一术语有两个容易混淆的定义:语言无关的通用定义:与程序有着相同生命周期(英语:Object lifetime)的变量;C族语言特有的定义:以static存储类声明的变量。而在以P 阅读全文
posted @ 2012-06-25 16:21 CBDoctor 阅读(4612) 评论(0) 推荐(0)
摘要: http://www.vckbase.com/document/viewdoc/?id=1898 阅读全文
posted @ 2012-06-06 21:28 CBDoctor 阅读(157) 评论(0) 推荐(0)
摘要: The GetParent function retrieves a handle to the specified window's parent or owner.To retrieve a handle to a specified ancestor, use theGetAncestorfunction.//该函数返回的是指定子窗口的父窗口的句柄,其中,参数hWnd为子窗口的句柄SyntaxHWNDGetParent(HWNDhWnd);ParametershWnd[in]Handle to the window whose parent window handle is to 阅读全文
posted @ 2012-05-27 15:07 CBDoctor 阅读(1368) 评论(0) 推荐(0)
摘要: 我们可以把进程看作是一个正在独立运行的独立的程序,在内存中有其完备的数据空间和代码空间。线程是在某一个进程中单独运行的单元,也就是说,线程存在于进程之中。一个进程有多个或者单个线程组成,各个线程共享相同的代码和全局数据,但是各有其自己的堆栈。由于每一个线程有一个堆栈,所以局部变量对每一个线程来说是私有的。由于所有的线程共享相同的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用。一个进程与线程的最重要的区别是:线程拥有自己的全局数据。线程存在于进程中,因此一个进程的全局变量有所有的线程共享。我们编写一个程序,来说明一下,为什么使用多线程!新建一个基于对话框的应用程序,在主对话框I 阅读全文
posted @ 2012-05-25 17:33 CBDoctor 阅读(1218) 评论(0) 推荐(0)