![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
VC++
文章平均质量分 72
btwsmile
不积跬步无以至千里
展开
-
初识dll,在VS2010平台上创建并使用dll(revised)
一、为什么需要dll代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,如ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点比较多,总结起来有4点。暴露了源代码;容易与程序员的“普通原创 2011-08-10 22:14:58 · 39493 阅读 · 2 评论 -
感知this指针 人工传递this指针技巧
引入C++与C明显的不同之处就是C++对类(class)的支持,这也是C++最初被称作C with classes的原因。我们知道类是属性和行为的封装,它既包含成员变量,也包含成员函数(或称方法)。如果成员变量是私有的,外界则无法直接访问,而只能求助于该类的方法,因此外界与类成员的交流基本上被限制在调用类方法上。实际上,依据C++的编程思维,是应该鼓励这种交流方式的。在设计类的时候,应尽量将属原创 2012-05-16 11:14:09 · 1612 阅读 · 0 评论 -
关于#pragma push_macro("new")
在三方库源码中,我们经常看到这样的代码:#pragma push_macro("new")#undef new// do something with new......#pragma pop_macro("new")它的作用就是将宏定义new压入栈并取消它的定义,如此一来new的本来含义便获得了恢复,使用完毕后将宏定义new弹出栈,恢复宏定义。不过,仍有下面两个问题需原创 2012-09-13 21:32:22 · 9116 阅读 · 0 评论 -
编程让任务管理器中CPU占有率呈现正弦曲线
《编程之美》的第一个问题:如何编程让任务管理器中CPU占有率呈现正弦曲线,博主尝试了一下,得到如图的结果。博主写出的代码如下所示:#include #include #include #include const double PI = 3.1415926;const int FREQUENCY = 360;const int AMPLITUDE = 100;int原创 2012-11-05 20:46:29 · 2043 阅读 · 0 评论 -
探秘窗口过程函数(WndProc)的Thunk技术
最近看了一篇讲ATL Thunk技术的好文章(下载),收获较多,在此做一个总结。Thunk技术的由来我们知道,经典的Windows程序设计采用纯Windows API来实现,创建一个窗口必须严格遵循“定义窗口类,注册窗口类,创建窗口,显示窗口,更新窗口,启动消息循环”的步骤。虽然经典的Windows程序设计在一定程度上已经体现出了OOP的思想 (对象 = 数据 + 代码),但是与当代的OO原创 2012-11-17 15:32:18 · 3587 阅读 · 2 评论 -
exit与return的区别
exit比return更加“暴力”,因为它将绕过临时变量、局部变量的析构方法。这意味着,对于那种需要清理堆内存的对象来说,这将引起内存泄漏。虽然程序运行后关闭,泄漏的内存会被OS收回,不过析构方法中有些善后操作或许是必需的,绕过它会带来一些麻烦,比如保存一些数据到文件。注意,exit绕过的仅仅是临时变量、局部变量的析构方法,全部变量、静态变量的析构方法仍然会被调用的。下面是一个例子://原创 2012-09-02 12:37:07 · 935 阅读 · 0 评论 -
Max Subsequence Sum 最大子序列和问题 O(NlogN)与O(N)算法的对比
《数据结构与算法分析》里用Max Subsequence Sum作为例子,介绍了算法分析的基本方法。书上提出了4种解决Max Subsequence Sum问题的算法,算法效率各不相同:O(N^3)、O(N^2)、O(NlogN)以及O(N)。后面两种算法很讨巧,特别是O(N)算法。O(NlogN)算法的思路:采用divide and conquer的方法,将序列平分为两部分,分别计算每部分的原创 2012-12-06 21:11:13 · 1993 阅读 · 1 评论 -
POJ1013 Counterfeit Dollar 解题报告
题目描述http://poj.org/problem?id=1013有12枚硬币(标记为A-L),其中有1枚是假币,但不知道假币比真币更轻或更重。Sally借助于天平,设计出一种方案,可以恰好三次测量出谁是假币、比真币更轻或更重。要求你帮助Sally,根据她的测量数据,计算出谁是假币、比真币更轻还是更重。例如一组测量数据为:ABCD EFGH even ABCI EFJK up原创 2012-12-27 11:30:07 · 1249 阅读 · 0 评论 -
POJ1009 Edge Detection 解题报告
http://poj.org/problem?id=1009主要解决三问题1. 图像的存储输入采用的是RLE编码,存储也采用类似的方式,但要做点变换。比如输入715 4100 1525 2175 225 5175 225 50 0经过变换,得到715 4100 1925 21175 2325 28175 3025原创 2012-12-20 11:11:19 · 1351 阅读 · 0 评论 -
C++流操作之fstream
在Windows平台对文件进行存取操作可选的方案有很多,如果采用纯C,则需要用到File*等,当然也可以直接调用Windows API来做;如果采用C++,首先想到的就是文件流fstream。虽然在COM层面上,我们还可以使用IStream来实现文件的读写,其效率也非常高。不过本文仅对C++流操作做简单的探讨,相比于Windows API或IStream,C++的流操作通用性更好一些,因为你能轻松原创 2013-09-16 16:11:11 · 1972 阅读 · 0 评论 -
C++文件流ios::binary的作用
在创建文件流时,可以显示指定它的打开方式为ios::binary,也就是以二进制方式打开。但是,无论是否指定二进制方式打开文件,读写的最小单位都是字节。那么,它到底起到什么作用呢?以二进制方式打开与普通打开方式的区别是什么?实际上,二者最大的区别在于对换行符的处理方式不同。由于历史原因,Windows操作系统是用两个字符(\r\n)来表示换行符的;而Unix操作系统却是用单个字符(\n)来表示原创 2013-09-23 12:08:26 · 13775 阅读 · 1 评论 -
一道百度校招笔试题
要求是编码实现htons方法,将整数转换成适合传输的网络字节序。这道题要考虑几个要点:1. htons的签名式是怎样的?2. 如何用C语言实现?第一个问题考察你对socket编程是否了解,因为htons是Win socket库函数,专门用来转换字节序。实际上,htons是常用的转换函数之一,其它还有htonl、ntohs、ntohl等。函数名中h即host,n即network,s即原创 2013-10-15 19:50:14 · 1398 阅读 · 0 评论 -
强制修改const char*类型的数据
C++是一门类型安全(type-safe)的编程语言,它对类型的检查是十分严格的。一个const char*类型的数据是不允许被修改的,如果程序违反了这条规定,编译器将毫不留情地提示错误,不让通过。作为程序员,须知道这样的限制是很有实际意义的,毕竟大多数情况下我们需要类型安全的代码。但是有的时候,我们真的需要修改const char*类型的数据,怎么办?没问题,C++同样也是一门相当灵活的编程语言原创 2011-09-13 22:14:22 · 3746 阅读 · 1 评论 -
C++关键字static,你必须知道的语义
1.所有被static修饰的变量都被存储到全局存储区,因为static数据的生命周期与全局函数一样,拥有一样的“static enduration”。注意,被static修饰的常量并没有这个性质,比如static const int n=1,n是不允许被修改的常量,它在编译期就被全部换成了1,并不占用固定的存储空间。2.关键字static的作用是通过编译器表现出来的,编译器会对static类型原创 2011-08-20 10:06:30 · 1182 阅读 · 1 评论 -
自定义C++异常处理
例1:自定义一个继承自excepton的异常类myExceptionC++标准中,定义在中的任何异常类都派生自exception Class,本例也只是简单地由exception继承,在try段抛出一个异常并捕捉。代码如下:/*++ test.cppversion:1.0decript:define a exception class named myException deriv原创 2011-08-14 11:21:39 · 12053 阅读 · 1 评论 -
透彻理解C++模板包含模型
观点包含模型是C++模板源代码的一种组织方式,它鼓励将模板代码全部放在一个.h头文件中,这样可以避免莫名其妙的链接错误。莫名其妙的链接错误一般而言,程序员习惯将函数和类的声明放在.h文件、把它们的实现放在.cpp文件,这种多文件组织方式一直被倡导。一方面,这种分离使得代码逻辑清晰,想要了解程序用到哪些全局函数和类,只要查看.h文件就可以。如果把声明和实现都揉在一起,带来的麻烦可想而知,原创 2011-08-17 17:53:50 · 2611 阅读 · 1 评论 -
谈谈C++类型安全
什么是类型安全?类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿原创 2011-08-16 23:15:08 · 13411 阅读 · 3 评论 -
编译器的返回值优化
如果函数返回值是一个对象,要考虑 return 语句的效率。例如 return String(s1 + s2); 这是临时对象的语法,表示“创建一个临时对象并返回它” 。不要以为它与“先创建一个局部对象 temp 并返回它的结果”是等价的,如 String temp(s1 + s2); return temp; 实质不然,上述代码将发生三件事。首先,temp原创 2011-08-12 22:11:33 · 1227 阅读 · 0 评论 -
fflush(stdin)和fflush(stdout)
fflush(stdin)比较容易理解,即清理标准输入流,把多余的仍未被保存的数据丢掉。比如,下面这个小程序:void main(){ int a; char str[10]; cin>>a; cout cin>>str; cout}目地很简单:从stdin获得一个整数原创 2011-08-15 11:36:03 · 1737 阅读 · 0 评论 -
也谈C++内存区域
众所周知,C++内存区域被分为5大类:栈、堆、自由存储区、全局/静态存储区、常量存储区。 栈由编译器控制,栈空间的申请、使用和释放全权由编译器处理。这里的“全权处理”意思是责任归属,并不是说编译器在程序运行时介入管理。实际上,编译器的工作在编译期就完成了,它对栈的管理体现在编译时对寄存器esp的维护上。 堆即程序员使用new和delete操作符进行管理的内存区域。对堆的访问往往原创 2011-08-19 22:38:27 · 1101 阅读 · 1 评论 -
main函数第3个参数envp装的是什么
1.引入 一般情况下,main函数带有两个参数,分别为int argc和char* argv[],各自表示参数个数、参数选项。比如在cmd窗口中运行ping www.csdn.net -t,那么传到ping程序的main函数的两个参数argc=3,argv[]={"ping","www.csdn.net","-t"}。查看MSDN,可选的原型为int main(intargc,char*a原创 2011-08-14 17:50:49 · 13407 阅读 · 2 评论 -
ATL-Style类 (模板基类) 定义的一种AV错误
下面是一个典型ATL风格的类定义:#include "stdafx.h"#include "iostream.h"template class B1{public: void SayHi() { T* pT = static_cast(this); pT->PrintClassName(); }protected:原创 2011-05-22 17:33:00 · 1007 阅读 · 0 评论 -
编译器对const char*的态度转变
1.问题char * str="Astring";strrev(str);上面这两行代码,第一眼感觉是没有错的,而且MSDN里面也是这样写的。编译能够通过,但是运行起来就会报错,提示Access Violation(访问越界)。MSDN里面的代码精简一下大致是这样:/*++ cstr.cpp * *version:1.1 *created:2011-08-14 21:30原创 2011-08-14 22:32:57 · 1326 阅读 · 2 评论 -
模板类的不完全实例化
知识点: 在显式实例化模板类时,模板类并不会进行完全的实例化。更具体的,模板类的成员函数当且仅当被调用时才进行实例化;不被调用的成员函数,编译器不对它进行实例化,甚至不做语义检查。例子: 定义一个模板类BinGather,其模板形参为class T,包含两个成员变量a和b,并拥有3个成员函数print和compare以及显式构造函数。代码如下:#incl原创 2011-08-16 11:46:11 · 2323 阅读 · 2 评论 -
一道微策略校招笔试题
MicroStrategy的题目出得真心有水平,下面是其中一道。判断一棵二叉树是否为二叉搜索树(binary search tree),二叉搜索树满足下列条件:1. 根节点的值(key)比它的左子树所有节点的值都要大,比它的右子树所有节点的值都要小;2. 左子树和右子树也都是二叉搜索树;3. 不存在重复节点。显然二叉搜索树的中序遍历结果正好是递增序列。假设中序遍历前一个节点的值原创 2013-10-16 21:19:27 · 1752 阅读 · 0 评论