C/C++ Primer/STL
Beyond_cn
这个作者很懒,什么都没留下…
展开
-
INT_PTR,DWORD_PTR...
DWORD_PTR的定义是, 这个类型至少可以确保放得下DWORD并且确保放得下一个指针。 DWORD的长度是固定得32位, 而指针的长度是跟硬件、系统、编译器什么的有关系的。 所以如果你是在做32位程序,那么 DWORD_PTR就跟DWORD是一回事。如果你是在做64位程序,那么 DWORD_PTR是64位的, 而DWORD永远是32位; INT_PTR一个意思; INT_P原创 2009-09-04 08:24:00 · 1841 阅读 · 0 评论 -
C++中智能指针的设计和使用
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷转载 2013-10-24 11:29:33 · 886 阅读 · 0 评论 -
const修饰符的作用
[cpp] view plaincopy/* C/C++中规定,在变量前加const修饰符是将变量定义为常量,其值是不能修改的 但这个不能修改也只是针对编译器而言 */ #include int main() { const int a = 2; int *b,i = 0; pr转载 2013-10-24 11:31:42 · 1077 阅读 · 0 评论 -
VC多线程编程二(转载自o(∩_∩)o地平线上看日出)。。。
例程6 MultiThread6 建立一个基于对话框的工程MultiThread6,在对话框IDD_MULTITHREAD6_DIALOG中加入一个按钮IDC_UI_THREAD,标题为“用户界面线程” 右击工程并选中“New Class…”为工程添加基类为CWinThread派生线程类CUIThread。给工程添加新对话框IDD_UITHREADDLG,标题为“线程对话框”。为对话框IDD转载 2009-07-22 09:13:00 · 639 阅读 · 0 评论 -
C++继承:公有,私有,保护
公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。1. 公有继承(public)公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。2. 私有继承(private)私有继承的特点是基类的公有成员和保护成员都作为派生类的私有转载 2013-09-04 15:37:07 · 849 阅读 · 0 评论 -
浮点数/float/double 是否需要考虑网络字节序的问题
在网络上传输数据时,对整数,我们使用转换为网络字节序的方法,来保证跨平台传输数据时不会出现字节顺序问题导致的解析错误,但是对浮点数,是否也需要这样做?在socket编程中,只有针对整型的字节顺序转换函数,例如htonl(),htons()等,浮点数怎么办?这里先转载一段网上摘取的文章:___________________________________________________转载 2013-07-02 16:40:26 · 1339 阅读 · 0 评论 -
在基类中用虚析构函数的原因
C++的多态性是通过虚函数来实现的,虚函数的出现使得动态链接成为可能。基于构造函数的特点,不能将构造函数定义为虚函数,但可以将析构函数定义为虚函数。一般情况:当派生类的对象从内存中撤销时,会先调用派生类的析构函数,然后自动调用基类的析构函数,如此看来析构函数也没有必要定义为虚函数。但如考虑如下这种情况,如果使用基类指针指向派生类的对象,而这个派生类对象恰好是用new运算创建的,这种情况转载 2013-06-25 17:05:12 · 792 阅读 · 0 评论 -
C++中的向上类型转换和向下类型转换
在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类,和基类向子类的强制类型转换。向上强制类型转换切割:覆盖方法和子类数据丢失的现象生成切割(slice)[cpp] view plaincopyclass Base { public: int b; virtual void转载 2013-06-17 22:20:57 · 991 阅读 · 0 评论 -
纯虚函数能为private吗?
我们把一个仅仅含有纯虚函数的类称为接口,我们也好像已经习惯了将这个接口中的所有纯虚函数全声明为public,而且按照这样的设计,一切都工作得不错。比如COM正是这样做的,它的接口中几乎不会存在private的纯虚函数。那么,让我们想一想,纯虚函数或者虚函数可以为private吗?如果这种方式是可行的,那么什么时候可以将(纯)虚函数设为private了?这些都是本文将要讨论的主题。一起来看看。转载 2013-09-04 15:50:12 · 835 阅读 · 0 评论 -
C++ 拷贝构造函数和赋值构造函数
在C++中复制控制是一个比较重要的话题,主要包括复制构造函数、重载赋值操作符、析构函数这三部分,这三个函数是一致的,如果类需要析构函数,则它也需要复制操作符 和 复制构造函数,这个规则被称为 C++的“三法则”。如果需要手动定义了其中了一个,那么另外的两个也需要定义,通常在存在指针或者前期相关操作的情况下,都需要手动的定义。 复制构造函数与重载赋值操作符实现的大题相同,如果没有转载 2013-08-11 12:11:58 · 1135 阅读 · 0 评论 -
c++继承中的内存布局
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。——谈VC++对象模型(美)简.格雷程化 译译者前言一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ O转载 2013-10-24 11:24:07 · 812 阅读 · 0 评论 -
VC多线程编程三(转载自o(∩_∩)o地平线上看日出)。。。
下面再通过一个实例进行演示说明。例程8 MultiThread8 建立一个基于对话框的工程MultiThread8,在对话框IDD_MULTITHREAD8_DIALOG中加入两个按钮和两个编辑框控件,两个按钮的ID分别为IDC_WRITEW和IDC_WRITED,标题分别为“写‘W’”和“写‘D’”;两个编辑框的ID分别为IDC_W和IDC_D,属性都选中Read-only; 在M转载 2009-07-23 08:35:00 · 786 阅读 · 0 评论 -
LRESULT...
在VS2005中,自定义消息处理函数都要求返回LRESULT。如果返回值不需要处理,可直接返回0即可;如果该消息需要返回特殊值,就看程序的需要进行返回相应的值。原创 2009-09-04 08:30:00 · 791 阅读 · 0 评论 -
LPSTR,LPCSTR,LPWSTR,LPCWSTR,LPTSTR,LPCTSTR,TCHAR...
首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。 LP的含义是长指针(long pointer)。LPSTR是一个指向以'/0'结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。而LPCSTR中增加的'C'的含义是"CONSTANT"(常量),表明这种数据类型的实原创 2009-09-04 08:36:00 · 969 阅读 · 0 评论 -
C或C++ 求两个数组相同元素个数
问:两个数组f[] g[] 长度不定 元素从大到小排列好了 每个数组中元素各不相同 请问如何编程能求两个数组相同元素个数 例如f[4]={1,3,4,7} g[5]={2,3,5,7,8} 有2个相同返回2 并求时间复杂度 最好时间复杂度小点 就是运算次数越少越好答:#include int Match2Array(const int * pArray1 , int iSize1 , co转载 2013-08-15 12:55:52 · 8941 阅读 · 0 评论 -
C++编程思想笔记。。。
类描述了一组有相同特性(数据元素)和相同行为(函数)的对象。类实际上就是数据类型,例如,浮点数也有一组特性和行为。区别在于程序员定义类是为了与具体问题相适应,而不是被迫使用已存在的数据类型。这些已存在的数据类型的设计动机仅仅是为了描述机器的存储单元。程序员可以通过增添他所需要的新数据类型来扩展这个程序设计语言。该程序设计系统欢迎创建、关注新的类,对它们进行与内部类型一样的类型检查。原创 2009-09-01 09:16:00 · 692 阅读 · 0 评论 -
内联函数,构造函数,静态函数都不能是虚函数
inline, static, constructor三种函数都不能带有virtual关键字。inline是编译时展开,必须有实体;static属于class自己的,也必须有实体;virtual函数基于vtable(内存空间),constructor函数如果是virtual的,调用时也需要根据vtable寻找,但是constructor是virtual的情况下是找不到的,因为const转载 2013-10-08 11:15:30 · 1020 阅读 · 0 评论 -
explicit关键字的使用...
单参数构造函数的一个隐含意思是:将该参数转换成该类的一个对象。这实际上是一个隐式的类型转换。要注意,参数定义缺省值的构造函数只要在调用时能形成单参数形式,同样具有隐式类型转换功能。关键字explicit用来禁止编译器隐式调用该构造函数,以防止隐式的类型转换,但对显式调用该函数则没有问题#include "stdafx.h"class CTest{public: //ex原创 2009-09-02 09:53:00 · 805 阅读 · 0 评论 -
画UML类图
学习设计模式,画UML类图是基础,通过UML类图,能更好地和大家交流,也能很容易就表达出自己的设计想法,它就好比普通话,是一种标准语言。 现在流行的主要工具有两种:Rational Rose 和Microsoft Visio,这两种工具都比较易用,选择哪种工具就看个人的喜好了。本人对Microsoft的软件比较有好感,所以自然Microsoft Visio 2003是我的首选。转载 2013-08-17 22:38:52 · 1600 阅读 · 0 评论 -
LocalAlloc,VirtualAlloc,malloc,new的异同
1. 首先我们来看HeapAlloc:MSDN上的解释为:HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连续的空间能满足分配的大小,程序不能将其他零散的 空间利用起来,从而导致分配失败),该分配方法是从一指定地址开始分配,而不像GloabalAlloc是从全局堆上分配,这个有可能是全局,也有可能是 局部。函数原型为:LPVOIDHeapAlloc(转载 2010-05-31 16:00:00 · 1454 阅读 · 0 评论 -
VC多线程编程一(转载自o(∩_∩)o地平线上看日出)。。。
一、问题的提出编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下:void CSingleThreadDlg::OnSleepSixSecond() {Sleep(6000); //延时6秒}转载 2009-07-21 08:13:00 · 868 阅读 · 0 评论 -
dynamic_cast
作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别。除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转换的对象。而dynamic_cast则不然。在这里,不再讨论其他三种转换和C风格的转换。首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的sou转载 2013-08-08 16:18:27 · 845 阅读 · 0 评论 -
补码
1. 补码概念(计算计系统计算的基础)补码(two's complement)在计算机系统中,数值一律用补码来表示(存储)。正数的补码是其本身(正数的原码、反码、补码都是其本身),例如char=5 表示为 0000 0101负数的补码是其对应正数按位取反+1,例如char=-5 表示为 1111 1011主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处转载 2013-07-27 07:08:37 · 1032 阅读 · 0 评论 -
sprintf
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。sprintf 是个变参函数,定义如下:int sprintf( char *buffer, const char *format [,转载 2013-06-17 22:31:57 · 673 阅读 · 0 评论 -
字符与编码
1. 编码问题的由来,相关概念的理解1.1 字符与编码的发展从计算机对多国语言的支持角度看,大致可以分为三个阶段: 系统内码说明系统阶段一ASCII计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。英文 DOS阶段二ANSI编码(本地化)为使计算机支持更多语言,通常使用 0x80~0xFF 范围的转载 2014-07-28 19:57:56 · 916 阅读 · 0 评论 -
从程序员的角度看ASCII, GB2312, UNICODE, UTF-8
0. 概念字节是计算机的最基本存储单位,一个字节包括8个位.字符是一种文字的基本单位,比如'A' 是一个字符,'汉' 也是一个字符.1. 计算机被发明之后,程序员们编写了很多复杂的计算让计算机运行.但是一个问题是,计算机如何把辛苦计算的结果告知程序员? 假设计算机把计算结果放在某个寄存器,内容是 1010010总不能让程序员去检测每个引脚的电位吧? 还是得有个显示器.显转载 2014-07-28 20:24:23 · 751 阅读 · 0 评论 -
VS2008使用命令行选项查看对象的内存布局
微软的Visual Studio 2008(VS2008)提供了一个新的选项,给用户显示C++对象在内存中的布局。这个选项就是/d1reportSingleClassLayout。具体使用方法如下,在写好相应的cpp文件之后,需要启动VS2008的命令行工具“Visual Studio 2008 Command Prompt”,切换到cpp文件所在目录之后,输入如下的命令:转载 2014-08-13 20:07:12 · 822 阅读 · 0 评论 -
静or动态库中的全局变量被不同的dll调用修改,其值是否独立
今天做了一个C++程序实验,以确认一下静态库和动态库中的全局变量被不同的dll调用时,其值是各自独立的还是共享的?结果显示: 一个静态库中的全局变量被同一个进程的不同的dll调用时,每一个dll对这些全局变量都各自有一份独立的存储空间,即使这些dll处于同一个线程。因为是静态库,在编译每一个独立的dll时,就已经为每个dll分配了静态库中全局变量的存储空间,所以在一个dll中转载 2015-01-07 20:21:12 · 1255 阅读 · 0 评论 -
将一个十六进制字符串转换为十进制数值
在程序中,我们有时需要将一个十六进制字符串转换为十进制数字。比如:char *ptr="0x11";int n=0;//我们想让n等于0x11,即17通常我们在C中,想将一个字符串转换为一整形数字,通常会使用下面的方法:char *ptr="123"; int n=0; n=atoi(ptr); printf("%d/n",n)转载 2015-01-07 20:23:17 · 1536 阅读 · 0 评论 -
工作线程和主线程
使用多线程编程的几个常见问题- -1、工作线程还是用户界面线程?对于一个多线程编程高手来说,没有两难的选择,因为不论工作线程还是用户界面线程,其本质是完全相同的。所不同的只是用户界面线程为用户增加了消息循环机制,而使用工作线程,你自己也很容易能做到这点。由于增加了消息队列,用户界面线程可以与窗口类协同工作,并方便地使用各类消息处理;但相对工作线程要占用更多的系统资源,对于一个使用大量线程的应用,你转载 2009-07-17 08:19:00 · 2861 阅读 · 0 评论 -
string大小写转换
如何将一个字符串转换成大写或者小写?这是字符串匹配中经常需要做的事情,然而C++的Standard Library并没有提供将std::string转成大写和小写的功能,只有在提供将char转成大写(toupper)和小写(tolower)的功能而已。但我们可以利用STL的transform配合toupper/tolower,完成std::string转换大(小)写的功能,也看到 模版编程 的转载 2015-01-07 19:08:59 · 1250 阅读 · 0 评论 -
c++中的左移、右移运算
移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移运算中。 c++中,整数分有符号数和无符号数两种,对于这两种数做左移、右移运算,稍有区别:转载 2015-06-06 10:30:02 · 1289 阅读 · 0 评论 -
C++的Json解析库:jsoncpp和boost
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的json解析库的使用方法。json官网上列出了各种语言对应的json解析库,作者仅介绍自己使用过的两种C++的json解析库:jsoncpp(v0.5.0)和Boost(v1.34.0)。 一. 使转载 2015-06-06 16:21:11 · 951 阅读 · 0 评论 -
#ifdef
这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:12345#ifdef标转载 2014-07-28 19:55:27 · 822 阅读 · 0 评论 -
一个int和long占多少个字节
一个int占多少个字节?这个问题我们往往得到的答案是4.但是int到底占多少个字节,却跟你的机器环境有关.[html] view plaincopyAs you can see, the typical data type sizes match the ILP32LL model, which is what mos转载 2014-07-07 19:51:02 · 3251 阅读 · 1 评论 -
sizeof
1、定义sizeof是C语言的一种单目操作符,它并不是函数。sizeof操作符以字节形式给出了其操作数所占存储空间的大小。操作数可以是一个表达式或括在括号内的类型名。操作数所占存储空间的大小由操作数的类型决定。作用就是返回一个对象或者类型所占的内存字节数。2、语法sizeof有如下三种语法形式:(1) sizeof( object ); // sizeof( 对象 );(2)转载 2013-06-17 22:34:57 · 756 阅读 · 0 评论 -
传递动态内存
当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道.这些往往会使人受尽折磨.所以如果你想深入C/C++编程,你必须静下心来,好好苦一番.现在我们将讨论C/C++里我认为哪一本书都没有完全说清楚,也是涉及概念细节最多,语言中最难的技术之一的动态内存的传递.并且在软件开发中很多专业人员并不能写出相关的合格的代码. void MyFunc(char *pReturn,转载 2013-06-12 12:20:05 · 596 阅读 · 0 评论 -
强内聚与松耦合
IT界有一句很著名的口号:强内聚、松耦合。 即使是最初级的程序员,在常常的被教导中,他也了解了这句口号的含义:我们的程序要模块化,模块要完成明确的一组关联的服务功能,要求它的各部分是相关的、有机组合起来是完整体(外部程序来看黑盒子),模块的内部各成分之间相关联程度要尽可能高(强内聚);而模块与模块之间又要求是可分拆的、少依赖的(松耦合)。 人们易于实现强内聚的模块,例如:一个函数实现一转载 2013-11-20 16:16:53 · 1271 阅读 · 0 评论 -
虚拟继承入门
为什么要引入虚拟继承?虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,也并不常用,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要(因为这样只会降低效率和占用更多的空间,关于这一点,我自己还没有太多深刻的理解,有兴趣的可以看网络上白杨的作品《RTTI、虚函数和虚基类的开销分析及使用指导》,说实话我目前还没看得很明白,高人可以指点下我)。以转载 2013-10-24 11:26:59 · 781 阅读 · 0 评论 -
小心删除容器中元素时的迭代器失效
从一个简单的问题开始,删除数组中某个元素后连续重复的元素,例如 1,1,2,3,3,1,1,1,4,0 ---> 1, 2,3,1,4,0。考虑了几秒,然后就开始动手写代码了:#include #include using namespace std;int main(int argc, char* argv[]){ int a[] = {1, 1,转载 2014-03-05 14:55:10 · 1333 阅读 · 0 评论