
C++
文章平均质量分 61
startwithdp
把知识点串成线,然后组成面
展开
-
全局函数的声明和定义
我在一个CPlusTestSuite.h文件中定义了一个全局函数namespace PlusTest{ std::string plusSuiteName() { return "PlusTest"; }}然后工程中有两个文件分别包含了(直接或间接)这个头文件。就会出现重定义的错误:1>Linking...1>BB.obj : er原创 2011-12-31 16:11:42 · 11336 阅读 · 2 评论 -
浮点数(单精度、双精度数)的有效位
浮点数7位有效数字。双精度数16位有效数字。浮点数取值范围:负数取值范围为 -3.4028235E+38 到 -1.401298E-45,正数取值范围为 1.401298E-45 到 3.4028235E+38。双精度数取值范围:负值取值范围-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范围为 4.9原创 2013-03-26 13:54:46 · 16928 阅读 · 2 评论 -
C/C++如何成为跨平台的语言
正如Java的跨平台(Write Once,Run Everywhere)需要JVM的支持一样,C/C++成为跨平台的编程语言,依赖各个平台(包括操作系统和编译器)对C/C++标准函数库的具体平台实现。VS编译器自带的标准C函数库,,,中声明的函数可以到C:/Program Files/Microsoft Visual Studio/VC98/CRT/SRC(或C:/Program F原创 2013-04-10 21:21:48 · 857 阅读 · 0 评论 -
DLL中调用约定和名称修饰
转载自:http://blog.youkuaiyun.com/bird67/article/details/4019044调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议。这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。不同的语言定义了不同的调用约定。 在C++中,为了允许操作符重载和函数重载,C++编译器往往转载 2013-04-22 15:37:18 · 570 阅读 · 0 评论 -
最小外包矩形对象的封装
最小外包矩形MBR就是包围图元,且平行于X,Y轴的最小外接矩形。 template struct CGeoRect { // Four corner points T m_minX; T m_minY; T m_maxX; T m_maxY; // // C原创 2013-05-23 16:34:46 · 2316 阅读 · 0 评论 -
枚举
C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。它还允许定义新类型,但必须按严格的限制进行。使用enum的句法与使用结构相似。enum spectrum{red, orange, yellow, green, blue, violet, indigo, ultraviolet };这条语句完成两项工作:1. 让spectrum成为新类型的名称;spec原创 2013-05-27 13:39:46 · 691 阅读 · 0 评论 -
引用与指针的比较
1. 引用被创建的同时必须被初始化,指针则可以在任何时候被初始化;2. 不能有NULL引用,引用必须与合法的存储单元关联;指针则可以是NULL;3. 一旦引用被初始化,就不能改变引用的关系;指针则可以随时改变所指向的对象;例如:int i = 5;int j = 6;int &k = i;k = j; //k和i的值都变成了6;以上示例程序中翻译 2013-05-27 16:17:47 · 585 阅读 · 0 评论 -
extern "c"
(1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:extern "C"{#i nclude "cExample.h"}而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。笔者编写的C++引用C函数例子工程中转载 2013-06-05 18:20:07 · 859 阅读 · 0 评论 -
如何计算结构体的大小
运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。 C语言中的构造数据类型有三种:数组、结构体和共用体。数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数。结构体中的成员可以转载 2013-06-17 14:36:26 · 572 阅读 · 0 评论 -
MapX常用功能代码逻辑
例程参见DET中的CMapXOP类和CRoadAttrCompReplaceDlg类。1. 创建控件 if ( !CMapX::Create( lpszWindowName , dwStyle , rect ,pParentWnd , nID , pPersist , bStorage , bstrLicKey ) ) return FALSE; CMapX::SetMa原创 2014-03-18 22:46:33 · 1404 阅读 · 0 评论 -
RadioButton的使用
1. 共有IDC_RADIO1、IDC_RADIO2,IDC_RADIO3,IDC_RADIO4四个Button;原创 2014-04-21 21:54:54 · 3928 阅读 · 1 评论 -
解释性语言与编译性语言
首先了解下计算机语言的发展,目前共经历四个时代,或许以后会出现5,6代语言 机器汇编高级C++、Visual C++、Visual Basic 、Delphi、Java等屏蔽了机器的细节,提高了语言的抽象结构化(面向对象)SQL是一个典型的结构化语言 虽然语言已经发展到了第四代,但是计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把其他语言翻译成机器转载 2014-05-13 21:09:40 · 2516 阅读 · 0 评论 -
GDI双缓冲实现与GDI+双缓冲实现
我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型指针转载 2013-03-21 13:32:55 · 1175 阅读 · 0 评论 -
虚函数地址表
虚函数地址表-vtablevtable是按照类中虚拟函数声明的顺序,一一填入函数地址。派生类会继承基类的vtable(当然还有其他可以继承的成员),当我们在派生类里修改了虚拟函数时,派生类的vtable中的内容也被修改,表中相应的元素不在是基类的函数地址,而是派生类的函数地址.详见收藏中的C++虚函数表解析原创 2013-03-19 16:42:00 · 676 阅读 · 0 评论 -
vs2005中查看对象的内存布局
在C++中,一个类实例化得到的结果就是一个对象。一个类包含成员变量和成员函数,其中成员变量又分为nonstatic成员变量和static成员变量;成员函数又可以分为nonstatic成员函数、static成员函数以及virtual成员函数。一个对象包含可能存在的vfptr以及它声明的或基类继承而来的nonstatic成员变量,static成员变量、static成员函数、nonstatic成员函数以转载 2013-03-19 15:43:31 · 1623 阅读 · 0 评论 -
工作积累之模板类实例化
模板函数在声明的时候, 其实并不存在,函数地址也就无从谈起了,而导出到动态链接库的函数都需要有地址(动态链接库不能将模板类导出,因为没法生成实例)如果把模板类的声明和定义都放在头文件中。需要用到模板类的时候,只需要包含该头文件,然后进行实例化。如果模板类的声明和定义分别放在头文件和源文件中。当实例化的时候,只包含头文件会发证链接错误。原因是模板类的实例化要分成两个步骤,模板的特例化转载 2012-03-14 09:57:38 · 2626 阅读 · 0 评论 -
开源库总结
开源C++库必须具有以下特点:必须是成熟的产品、跨平台的产品、相对通用的库。 一、通用标准类 STL:C++标准模板库,呵呵,它也是开源的嘛。 boost:C++准标准库,它是强大地,江湖称之"千锤百炼"。 deelx (轻量级的正则表达式解析类库,国产),boost里有强大的正则表达式解析库,但如果你只想要一个表达式解析,不想要拖上庞大的boost转载 2012-05-03 11:40:16 · 669 阅读 · 0 评论 -
工作积累之二维数组的理解
在多数情况下,C++将数组名视为数组的第一个元素的地址;一种例外情况是,将sizeof操作符用于数组名时,此时将返回整个数组的长度(单位为字节)。如:double wages[3];double *pw = wages;size of wages array = 24size of pw pointer = 4C++允许将指针和整数相加,加1的结果等于原来的地址值加原创 2012-05-28 18:27:29 · 979 阅读 · 0 评论 -
工作积累之malloc与new的区别
1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于m转载 2012-05-11 09:46:17 · 380 阅读 · 0 评论 -
STL之迭代器的类型介绍
STL 主要是由 containers(容器),iterators(迭代器)和 algorithms(算法)的 templates(模板)构成的. 对应于它们所支持的操作,共有五种 iterators(迭代器)。 input output \ /转载 2012-05-14 15:15:32 · 1279 阅读 · 1 评论 -
思考一些基本概念(持续更新中)
一、构造函数为什么不能为虚函数:1、所谓虚函数,也就是根据对象的动态类型决定调用哪个函数。 2、构造函数是在对象完全构造之前运行的,换句话说,运行构造函数前,对象还没有生成,更谈不上动态类型了。 这样看,构造函数不可能是虚函数。二、函数模板函数模板是一种不说明某些参数的数据类型的函数。例如,下面定义了一个可对任何类型变量进行操作(求绝对值)的函数模板:temp原创 2012-05-14 10:58:11 · 514 阅读 · 0 评论 -
工作积累之快速调试BUG
写软件不可避免会有BUG,如果一个BUG长时间解决不了,那是相当郁闷的一件事情。我总结自己这几年的工作,得出一些调试BUG的经验,在此加以记录,以便后面的工作少走弯路。如果碰巧我的经验对别人有帮助,那我就是赚了。1.快速调试:把测试用的数据从大数据量换成小数据量,缩短调试周期,这一经验不适合压力测试。2.隔离调试:把整个业务处理流程中的功能点加以梳理,每次只调试一个功能点,屏蔽掉其它功能点原创 2012-10-11 10:58:15 · 578 阅读 · 0 评论 -
工作总结之指针的引用
下面的代码不稳定,使用CVideoReplayer提供的职责时有时会出错。unsignedlong WINAPI CSysncReplayer::DoReplayVideo( void * para ){ try { CSysncReplayer * replayer = (CSysncR原创 2012-10-31 16:55:47 · 429 阅读 · 0 评论 -
工作总结之预处理指令与宏的使用
工作中的软件需要在不同的应用场景下,启动不同的视频采集硬件,启动的方法总结了一下,共有三种:1.通过预处理命令和宏来处理不同硬件的代码;2.通过硬编码硬件的识别码来辨别;3.通过UI让用户选择;我们着重看一下第一种。先来了解 #define语法:#define 标识符 替换列表#define 标识符[(标识符, 选择... , 标识符 )] 替换列表其实还有一种原创 2012-10-31 17:28:35 · 537 阅读 · 0 评论 -
关键字static的用法
概括:C与C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。面向过程的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Example 1#includ转载 2013-03-29 14:57:41 · 760 阅读 · 0 评论 -
LISKOV替换原则与继承
何时用继承呢?大部分情况我们仅仅为了利用另一个已存在的类的功能而继承,或者几个类有功能近似,或者代码重复,就提取个公用类,然后再继承之。长期以来,我都是这样的理解。如果从实现上来说,这样是没有问题的,复用了代码,减少了重复。但如果用Liskov原则来审查设计就会发现,这样的实现其实是很欠妥的。是滥用继承的一种。下面我们具体分析。 Liskov原则要求我们,“任何能用基类的地方转载 2014-06-17 10:33:53 · 846 阅读 · 0 评论