
C/C++
lwbeyond
这个作者很懒,什么都没留下…
展开
-
C++ 总结
C++ 虽然内容比较多,但是细分下来,可有几大部分组成,每一部分侧重点不同,我在学习过程中按这几大块来理解,发现很有效率,故总结如下。一、基本语言C/C++ 声明与定义C++类型转换C 指针精要二、面向过程的编程函数返回值问题函数内联成员函数的重载、覆盖与隐藏三、STL四、基于对象的编程详解C++ friend关键字详解 C++原创 2015-11-05 22:54:41 · 7935 阅读 · 0 评论 -
详解 C++ virtual 析构函数
第一种情况:基类指针指向派生类对象。#include using namespace std; class Base{ public: ~Base() {cout<<"~B"<<endl;}}; class Derived:public Base{ public: ~Derived() {cout<<"~D"<<endl;}}; int main ()原创 2012-04-25 12:36:54 · 3493 阅读 · 1 评论 -
C++类型转换
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a。C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。一. const_cast常量指针被转化成非常量指针,并且仍然指向原来的对象。常量引用被转换成非常量引用,并且仍然指向原来的对象。去掉类型的 const 或 volatile 属性。struct原创 2012-04-05 16:54:17 · 2615 阅读 · 0 评论 -
C 字符串精要
一. C语言常用字符串处理函数1. 字符串常用函数// 复制字符串char *strcpy( char *strDestination, const char *strSource );// 计算字符串长度,不包括最后的 '\0'size_t strlen( const char *string );// 字符串连接函数char *strcat( char *strDes原创 2012-03-30 12:33:34 · 1399 阅读 · 0 评论 -
C 位操作
一.位运算符C提供了几种位操作符,如下表所示:运算符含义运算符含义&按位与~取反|按位或左移^按位异或>> 右移二. 位运算操作1. "按位原创 2012-03-29 17:37:43 · 1390 阅读 · 0 评论 -
C++拷贝构造函数详解
一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a = 100;int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。#include using namespace std;class CExample {private: int a;原创 2011-02-23 13:39:00 · 466837 阅读 · 286 评论 -
C++类型转换详解--const_cast
一. 函数描述:const_cast ( expression )主要是用来去掉const属性,当然也可以加上const属性。主要是用前者,后者很少用。去掉const属性:const_case (&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。加上const属性:const int* k = const_case(j),一般很少用,因为可以原创 2011-02-28 15:49:00 · 61132 阅读 · 16 评论 -
sizeof 精要
要理解 sizeof 的要点,首先要明白字节对齐。一. 字节对齐但一般而言,满足以下两点个:1) 结构体每个成员相对于结构体首地址的偏移量都是本成员大小的整数倍,如不满足则加上填充字节;2) 结构体的总大小为结构体最宽的基本类型成员大小的整数倍,如不满足则在最后加上填充字; struct A { int a; char b; short c;};struct原创 2012-03-29 08:33:39 · 2030 阅读 · 3 评论 -
strcpy 详解
题目:已知strcpy函数的原型是: char * strcpy(char * strDest, const char * strSrc);1.不调用库函数,实现strcpy函数2.解释为什么要返回char *一. 实现strcpy//1.strcpy的实现代码 char * strcpy(char * strDest,const char * str原创 2011-02-12 17:45:00 · 4171 阅读 · 3 评论 -
c/c++中static详解
一. 程序的存储。 从历史上讲,C程序一直由下面几部分组成:1. 正文段 CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是经常环境指针环境表环境字符串执行的程序(如文本编辑程序、C编译程序、s h e l l等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改其自身的指令。2. 初始化数据段 通常将此段原创 2011-02-14 14:46:00 · 10046 阅读 · 6 评论 -
如何正确的关闭 MFC 线程
前言: 近日在网上看到很多人问及如何关闭一下线程,但是我看网上给出的并不详细,而且有些方法还是错误的。小弟在此拙作一篇,不谈别的,只谈及如何正确的关闭MFC的线程,至于Win32和C RunTime的线程暂不涉及。一.关于MFC的线程 1.MFC的线程有两种,一种称为Work线程,一种称为UI线程。一般情况下Work线程与UI线程的区别主要在于UI线程有消息队列(并不是有没有界面,原创 2010-06-22 13:20:00 · 45379 阅读 · 8 评论 -
线程的等待
一. 一般等待1. sleep()在操作系统中止此线程动作,直到渡过某个时间之后才恢复。VOID Sleep( DWORD dwMilliseconds // sleep time);实际上你不可能事先知道什么事情要等待多久,比如一个高优先级线程抢占执行的话,这个时间将变得不可预测。要注意的是,Sleep( ),会放弃系统分配的剩余的时间片,这样 OS 就能更好的服务原创 2012-05-30 15:58:28 · 4940 阅读 · 2 评论 -
printf 打印颜色
printf的颜色控制控制字符的通用格式如下:Esc[{attr1};...;{attrn}m其中:Esc 是转义字符, 其值为"\033";[ 是常量的左中括号;{attr1};...{attrn} 是若干属性, 通常是由一个有特定意义的数字代替, 每个属性之间用分号分隔;m 就是字面常量字符m;可用属性列表:通用格式控制:0 重置所有属性原创 2014-10-29 16:40:30 · 19363 阅读 · 3 评论 -
C 指针精要
一. 解读复杂指针声明右左法则:首先从标识符开始阅读,然后往右看,再往左看。每当遇到圆括号时,就应该调转阅读方向。一旦解析完括号里所有的东西,就跳出括号。重复这个过程直到整个声明解析完毕。int *a[10]// 首先 a 右边是[],说明 a 是一个具有10个元素的数组// 其次 a 左边是 int*,说明 a 的元素是 int 类型的指针int (*a)[10]//原创 2011-02-12 13:04:00 · 3181 阅读 · 3 评论 -
sprintf函数的用法
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。sprintf 是个变参函数,定义如下:int sprintf( char *buffer, const char *format [, a转载 2013-12-01 11:06:37 · 1360 阅读 · 1 评论 -
详解C++ friend关键字
概述:1. 为什么要使用友元?通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为 public( 共用的) ,然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它;另一种方法是利用 C++ 的 friend 修饰符,可以让一些你设定的函数能够对这些私有或保护数据进行操作。2. 使用友元有哪些缺点?使用友元的同时也破坏了类的封装原创 2012-05-22 16:21:43 · 14118 阅读 · 9 评论 -
C/C++ 声明与定义
变量的定义(definition):用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义;变量的声明(declaration):用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern关键字声明变量名而不定义它。有分配空间的叫定义,没分配空间的叫声明。 另外,“定义”的同时一定耦合原创 2011-06-26 14:45:00 · 3574 阅读 · 1 评论 -
线程同步----临界区与互斥量
Win32 中关于进程和线程的协调工作是由同步机制来完成的,同步机制相当于线程间的红绿灯。一. 同步和异步举个例子:PostMessage(),是把消息放到对方的消息队列中,然后不管三七二十一,就回到原调用点继续执行,这就是异步。SendMessage(),就像调用一般性函数,直到调用的函数结束,才会回到原点,这就是同步行为。二. Critical Sections原创 2012-05-30 17:50:01 · 8603 阅读 · 1 评论 -
线程同步----信号量(Semaphore)
创建信号量:HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全属性。NULL 为默认 LONG lInitialCount, // 信号量初值,必须 >= 0 LONG lMaximumCount, // 信号原创 2012-05-31 12:15:08 · 1768 阅读 · 0 评论 -
线程同步----事作(Event)
Event 对象最大的用途,正是因为它们的状态完全在你掌控之下。Mutex 和 semaphore 就不一样了,它们的状态会因为诸如 WaitXXX( ) 之类的函数调用而变化。所以你可以精确告诉一个 event 对象做什么事,以及什么时间去做。创建事件:HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SD原创 2012-05-31 12:18:18 · 1640 阅读 · 0 评论 -
线程的第一次接触
一. 产生一个线程HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性,NULL表示使用缺省值。 DWORD dwStackSize, // 线程的堆栈,0 表示用缺省大小: 1M LPTHREAD_START_ROUTINE lpSt原创 2012-05-30 11:45:23 · 1474 阅读 · 0 评论 -
c/c++中const详解
一. cons 的作用(1) 可以定义 const 常量const int Max=100;int Array[Max];(2) 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性如果在函数体内修改了i,编译器就会报错;void f (const int i) { i=10;//error! }(3) 为函数重载提供了一个参考c原创 2011-02-16 11:21:00 · 3033 阅读 · 4 评论 -
c/c++中typedef详解
1. typedef 最简单使用typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4 你可以在任何需要 long 的上下文中使用 byte_4。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。2. typedef 修饰数组typedef char mySizes[100]; mySizes xxx;原创 2011-02-17 17:17:00 · 17452 阅读 · 3 评论 -
Kill 掉一个进程
结束掉一个进程的几种方法, 及对于系统自动重调的应对策略!!原创 2010-08-26 10:55:00 · 3162 阅读 · 1 评论 -
使用BoundsChecker
<br />1.简介<br /> BoundsChecker是一个很强大的调试工具。这里只简单介绍如何用它的FinalCheck模式定位比较难定位的错误。<br />FinalCheck模式简单来说就是BoundsChecker在你的代码里加一些诊断代码来检查平时比较难查出的内存越界,错误的指针使用等。<br />不过付出的代价就是程序跑起来会比较慢,所以在不用时最好是把FinalCheck模式关掉。特别是发布前。<br /><br />2.启用FinalCheck模式(基于Visual Studio 2原创 2010-06-21 15:16:00 · 2418 阅读 · 0 评论 -
CString 与其他数据类型的转换
1. CString,int,string,char*之间的转换<br />string 转 CString <br />CString.format("%s", string.c_str()); <br />char 转 CString <br />CString.format("%s", char*); <br />char 转 string <br />string s(char *); <br />string 转 char * <br />char *p = string.c_str(); <br转载 2010-06-09 18:19:00 · 2468 阅读 · 0 评论 -
VC++中使用内存映射文件处理大文件
<br />摘要:本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍。<br /><br />引言<br /><br /> 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至转载 2010-06-08 16:34:00 · 1194 阅读 · 0 评论 -
UNICODE与MBCS等字符问题
VS2008默认的字符集是Unicode,而VC6.0默认是多字节字符集,Unicode字符集你要加_T("")或L"",你也可以“工程-属性-修改字符集”。 1. UNICODE:它是用两个字节表示一个字符的方法。比如字符A在ASCII下面是一个字符,可A在UNICODE下面是两个字符,高字符用0填充,而且汉字程在ASCII下面是两个字节,而在UNICODE下仍旧是两个原创 2010-03-24 09:33:00 · 1732 阅读 · 0 评论 -
窗口子类化
1. 窗口子类化-----------是创建一个新的窗口函数代替原来的窗口函数。 2. 窗口超类化-----------是要创建一个新的窗口类,窗口函数调用一个已注册类的窗口函数,就像子类窗口函数调用原始窗口函数一样。新类叫做超类。3. 不同之处是超类可以截取窗口创建之初的若干消息,而子类不行。 Subclass(子类化)是MFC中最常用的窗体技术之一。子类化完成两个工作:一是原创 2010-03-18 16:59:00 · 7163 阅读 · 0 评论 -
VC项目配置基础
一.预处理宏1. 通用宏VC6.0中:Project Setting à C/C++ à Preprocessor definitionsVC2005中:项目属性à配置属性àC/C++à预处理器定义 WIN32:指明是Window 32系统的编译器,一般用作平台识别。_MBCS/_UNICODE:指明该工程使用的字符集(多字节字符集/UNICODE)。在VC6.转载 2010-03-17 14:19:00 · 1419 阅读 · 0 评论 -
如何检测内存泄漏
初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程 序员出了一个难题。当程序越来越复杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题。内存泄漏是最常见的内存问题之一。内存泄漏如果不是很严 重,在短时间内对程序不会有太大的影响,这也使得内存泄漏问题有很强的隐蔽性,不容易被发现。然而不管内存泄漏多么轻微,当程序长时间运行时,转载 2010-02-25 10:13:00 · 2012 阅读 · 0 评论 -
VC中ComboBox使用详解
VC中ComboBox使用详解一、如何添加/删除Combo Box内容1,在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。换行用ctrl+回车。2,在程序初始化时动态添加如: //控件内容初始化 CString strTemp; ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除原创 2010-02-23 09:30:00 · 1157 阅读 · 0 评论 -
VC常用数据类型列表
VC常用数据类型列表原创 2010-09-08 17:00:00 · 1020 阅读 · 0 评论 -
CFile 打开方式及出错出理
CFile::modeCreate 让构造器创建一个新文件,如果那个文件已经存在,把那个文件的长度重设为<br />CFile::modeNoTruncate 可以同modeCreate. 一起用,如果要创建的文件已经存在,并不把它长度设置为0,因而这个文件获取或者作为一个新建文件或者作为一个已存在文件打开。这个功能往往很好用,比如说,当你需要打开一个设置文件,但是你并不清楚这个文件是否已经存在。<br /> CFile::modeRead 打开文件仅仅供读<br /><br /> <br />原创 2010-11-29 14:05:00 · 3460 阅读 · 0 评论 -
学习C++该看什么书?
怎么学习C++?该先看什么书,后看什么书?众说纷纭,下面是二篇网上流传的文章。<br /> C++学习之路<br /> (一)语言入门:<br /><br />《C++ Primer》<br /><br />最新版本:第三版(第四版国外已上架,国内一些网上书店也在预订中)<br /><br />适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是好事。<br /><br />《The C++ Programming Language》/《C++程序设计转载 2010-10-14 13:13:00 · 13749 阅读 · 2 评论 -
C/C++ extern详解
1.基本解释extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。2. extern 变量extern int a;仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。通常原创 2011-07-01 15:00:00 · 3559 阅读 · 0 评论 -
memcpy 与 memmove 区别
memcpy() -- 拷贝内存内容表头文件: #include 定义函数: void *memcpy(void *dest, const void *src, size_tn)函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束返回值:原创 2011-09-28 15:34:50 · 3596 阅读 · 1 评论 -
程序在内存中存储详情(Text、Data、BSS、Heap、Stack....)
先看下面的一段程序:char *string = "Hello World";int iSize;char *fun(void){ char *p; iSize = 8; p = malloc(iSize); return p;}存放的位置(相同的颜色对应)Text段:上面标记为红色的部分(还包括整个f转载 2012-02-20 13:43:14 · 3661 阅读 · 0 评论 -
详解C语言中volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如 果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举 例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序:short flag;v转载 2012-02-16 17:58:36 · 11871 阅读 · 4 评论 -
函数返回值问题
程序1: #include char *returnStr(){ char *p="hello world!"; return p;}int main(){ char *str; str=returnStr(); printf("%s\n", str); return 0;} 这个没有任何问题,因为"hello w原创 2011-12-19 12:21:51 · 2779 阅读 · 0 评论