
C++基础
HarbinZJU
这个作者很懒,什么都没留下…
展开
-
C++接口的设计——析构函数
接口不应该有实体函数,即接口的所有函数都应该是公共的纯虚函数。不过析构函数应该不应该是纯虚函数呢?如果是非纯虚的虚函数,那函数体要写什么呢?答案是什么都不写,内容为空的函数很不简洁,不爽。那就设置成纯虚函数,很遗憾,编译通不过,因为子类会调用父类的析构函数,父类析构函数指针不应该为空。那就考虑设置成普通函数吧,还可以省去声明,因为C++默认实现析构函数!一个显而易见的问题,当delete接口时只是转载 2013-11-15 11:13:37 · 5464 阅读 · 1 评论 -
关于C++中的public,protected, private
C++中的public,protected, private第一:private, public, protected 访问标号的访问范围。private:只能由1.该类中的函数、2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。但不能被该类的对象访问。public:可以转载 2010-08-21 21:25:00 · 815 阅读 · 0 评论 -
C语言面试题(嵌入式开发方向,附答案及点评)
预处理器(Preprocessor)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因转载 2010-08-27 22:58:00 · 9722 阅读 · 1 评论 -
深度剖析消息反射机制
摘要:在前面我们分析了控件通知消息WM_NOTIFY,和WM_NOTIFY紧密联系的还有一个MFC新特性:消息反射。本文中,我想就这个问题作一个全面的论述,如果有错误,还望各路大虾批评指正。 什么是消息反射? 在windows里面,子控件经常向父控件发送消息,例如很多子控件要绘制自己的背景,就可能向父窗口发送消息WM_CTLCOLOR。对于从子控件发来的消息,父控件有可能在转载 2010-11-06 17:01:00 · 996 阅读 · 1 评论 -
__declspec(selectany) 的作用是什么
在MFC,ATL的源代码中充斥着__declspec(selectany) 的声明。selectany可以让我们在.h文件中初始化一个全局变量而不是只能放在.cpp中。比如有一个类,其中有一个静态变量,那么我们可以在.h中通过类似" __declspec(selectany) type class::variable = value; "这样的代码来初始化这个全局变量。既是转载 2010-08-23 09:22:00 · 801 阅读 · 0 评论 -
#pragma once与#ifndef #define ...#endif的区别
#pragma once这个是编译相关,就是说在这个编译系统上能用,但是在其他编译系统不一定行,也就是说移植型差。不过现在基本上已经是每个编译器都有这个定义了.#ifndef #define ...#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的。如果写的程序要跨平台,最好使用这种方式。转载 2010-08-27 17:29:00 · 802 阅读 · 0 评论 -
C语言中关于自加的几个小题
下面几个题目的输出分别是? int i = 5; i = i++ * ++i; printf("%d", i); int i = 5; i = i++, i++ * ++i; printf("%d", i); int原创 2010-08-27 22:07:00 · 1054 阅读 · 0 评论 -
链表反转
单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:struct linka { int data;转载 2010-11-10 23:25:00 · 1085 阅读 · 0 评论 -
让进程外COM实现多实例
目标就是实现每创建一个COM实例,就开启一个进程。通过调用RegisterClassObjects方法实现。ATL默认的实现中参数设置为REGCLS_MULTIPLEUSE,改为REGCLS_SINGLEUSE就可以了。HRESULT PreMessageLoop(int /*nShowCmd*/) throw(){HRESULT hr = S_OK;T* pT = stati原创 2011-12-28 13:41:55 · 2119 阅读 · 0 评论 -
在catch中return,会执行finally吗?
请参考下面一段简单的语句块:1: try2: {3: throw new Exception("new exception");4: }5: catch(Exception ex)6: {7: return;8: }转载 2011-05-18 20:46:00 · 9824 阅读 · 2 评论 -
在VC中加载自定义资源类型,以PNG文件为例
代码为例,实现了从资源中加载PNG文件,初始化为Gdiplus::Image对象: HMODULE hInstance = ::GetModuleHandle(NULL); // 指定NULL,获取当前exe文件的句柄 HRSRC hRsrc = ::原创 2011-09-19 13:18:09 · 4481 阅读 · 0 评论 -
判断窗口是否被完全遮挡的方法
这个函数可以判断一个窗口,是否被完全遮挡住,可能是被一个或者多个窗口遮挡。实现思路:向上找到Z-Order大于目标窗口的窗口,将这些窗口逐一拼接,每拼接一个窗口后,判断一下目标窗口是不是被这个拼接后的区域覆盖。这里用到的CRgn来自WTL的atlgdi.h,MFC中也有相原创 2011-09-16 13:13:07 · 6609 阅读 · 0 评论 -
成员函数的重载、覆盖与隐藏
转自《林锐高质量C++编程指南》 成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防。8.2.1 重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于转载 2010-07-26 16:43:00 · 839 阅读 · 0 评论 -
CString与_bstr_t进行比较的问题
在把CString与_bstr_t类型进行比较的时候,你会怎么写呢?常见的写法有几种: CStringstrUID;_bstr_tbstrUID; If (strUID== bstrUID.GetBSTR()){ // xxxxx} If (strUID== (LPCTSTR)bstrUID){ // xxxxx} If(strUID原创 2012-04-17 09:53:59 · 2218 阅读 · 0 评论 -
浅学设计模式之简单工厂模式、工厂模式、抽象工厂模式
原文:http://blog.youkuaiyun.com/lilu_leo/article/details/7592678一、简单工厂 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是转载 2013-09-17 15:49:23 · 3632 阅读 · 0 评论 -
在C++中用C#风格设置类的属性值
想要实现的效果就是如下这样获取和设置类的属性:class A{private: int x;};A a;a.x = 1;int b = a.x;借助VC编译器所支持的属性声明即可实现:__declspec( property (put=setFunction, get=getFunction) ) data-type property-name; 通原创 2013-05-16 15:46:31 · 2890 阅读 · 0 评论 -
实现类非静态成员函数做窗口过程函数
实现类非静态成员函数做窗口过程函数,无非是想办法把类对象指针传递给窗口过程。最简单的办法是使用全局变量,在很多场景下是快捷有效的办法。这里介绍的办法是借助::SetWindowLong(hWnd, GWL_USERDATA, (LONG)pWindow)调用,把类指针传递给窗口。在窗口过程函数中再调用 GetWindowLong来获取出来使用。通过CreateWindowEx最后一原创 2013-04-16 14:22:58 · 3783 阅读 · 0 评论 -
public private 和protected 继承
在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public继承是最为常用的一种继承关系,private继承是最少见的继承关系。1. public从语义角度上来说,public继承是一种接口继承,根据面向对象中的关系而言就是,派生类可以代替基类完成基类接口所声明的行为,也就是必须符合“Liskov替换原则(LSP)”,此时派生类可以自动转转载 2013-02-06 11:30:01 · 2812 阅读 · 0 评论 -
C++转向C#的疑惑:难道C#中没有拷贝构造函数 ?
不可否认,C++在过去十年乃至现在一直都是windows平台上的主流开发语言,而来势凶猛的.NET势必开辟一个崭新的局面,从目前的种种迹象来看,.NET是大势所趋,而C#作为.NET平台上的第一开发语言自然备受关注,于是有很多程序员纷纷转向C#,这其中当然不乏C++程序员。情况往往是这样,从一种语言过渡到另一种语言,哪怕是比较相似的语言,程序员也经常无意识地陷入原开发语言的思维定势,这样的结果通常转载 2012-11-23 01:33:34 · 3166 阅读 · 1 评论 -
什么是窗口子类化
如果你曾经在 Windows 环境下编过程序,有时候就会发现:有一个现成的窗口,几乎有你所需要的全部功能,但还不完全一样。如果你需要一个具有过滤特殊字符功能的 Edit 控件。当然最直接的方法就是自己用代码来实现,但这的确是一个费时又很困难的任务,而子类化就可以用来做这种事情。 子类化允许你接管被子类化的窗口,使你对它有绝对的控制权。举个例子了来阐明一下:例如你需要一个只接受十转载 2012-11-15 20:29:54 · 3653 阅读 · 0 评论 -
利用boost提供的库构建读写锁与互斥锁
原文地址:http://herojiang.iteye.com/blog/432394boost库中提供了的mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁。 一种简易的构建方法如下: 首先看看mutex类,主要用到下面两种. mutex类: boost::mutex, boost::shared_mutex 其中mutex主要有lock与unloc转载 2012-09-20 11:35:08 · 5630 阅读 · 1 评论 -
如何获取系统任务栏位置
下面的代码用来判断任务栏位于屏幕的下方、下方、左侧还是右侧。APPBARDATA taskbar = {0}; taskbar.cbSize = sizeof(APPBARDATA); SHAppBarMessage(ABM_GETTASKBARPOS, &taskbar);switch(taskbar.uEdge){case ABE_BOTTOM: break;ca原创 2012-08-22 16:14:35 · 2991 阅读 · 0 评论 -
9 个开始使用 C++11 的理由
如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11。当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢?在我看来,答案毫无疑问是肯定的。我在下面给出了9个理由,它们分为两类:性能优势和开发效率。获得性能优势理由1:move语义(move semantics)。简单的说,它是优化复制的一种方式。有时候复制很显然是浪费的。如果你从一个临时的stri转载 2012-07-12 20:39:44 · 958 阅读 · 0 评论 -
UNICODE、UTF-8、ANSI的故事
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为"字节"。再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为"计算机"。开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。他们把其中的编号转载 2012-02-08 10:00:40 · 952 阅读 · 0 评论 -
【转载】字符,字节和编码
[转载自:http://www.regexlab.com/zh/encoding.htm]摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。本文的内容涵盖了“中文问题”,“乱码问题”。掌握编码问题的关键是正确地理解相关概念,编码所涉及的技术其实转载 2012-06-30 17:54:20 · 1009 阅读 · 0 评论 -
[一分钟学会系列之六]一分钟学会自定义鼠标指针图标(附DEMO程序)
这次和大家分享在自己窗口内改变鼠标指针图标的方法。关键在于处理WM_SETCURSOR消息,先看一下这个消息的定义:WM_SETCURSOR NotificationThe WM_SETCURSOR message is sent to a window if the原创 2011-09-11 12:00:19 · 5343 阅读 · 0 评论 -
boost::intrusive_ptr用法
头文件: "boost/intrusive_ptr.hpp"intrusive_ptr 是shared_ptr的插入式版本。有时我们必须使用插入式的引用计数智能指针。典型的情况是对于那些已经写好了内部引用计数器的代码,而我们又没有时间去重写它(或者已经不能获得那些代码了)。另转载 2011-09-06 20:17:34 · 13166 阅读 · 0 评论 -
C++游戏开发中使用json
<br />最近想写一个自定义的动画数据文件,按照原来的做法,先定义一个文本格式的数据文件,然后写一个转换器转换成二进制,然后游戏中读入并解析。不过我最近特别懒,虽然我已经设计了一个“万能的”文本格式和二进制转换工具,但是解析二进制文件的工作仍然繁琐,并且根据以往的经验,可能会经常的修改文件格式,于是我想直接使用文本格式吧,首先想到的是XML,不过最近实在太懒了,连XML都懒得去解析,嗯,还有google Protocol Buffers这东西,以前看过,不过似乎用的人不多啊,还有一个json,转载 2011-01-24 09:40:00 · 1918 阅读 · 0 评论 -
HRESULT和Windows Error Codes的一些基础介绍
<br />在用C++来开发Windows程序时,经常看到下面的判断情况:HRESULT hr = ::RegCreateKeyEx(hk, szKeyPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hk, NULL);<br /><br />if (SUCCEEDED(hr)) <br />{<br />在代码中,使用SUCCEEDED宏来判断函数RegCreateKey转载 2011-01-23 22:36:00 · 1765 阅读 · 1 评论 -
VC环境下编译OpenSSL
<br />VC环境OpenSSL安装以及编程过程<br /> <br />SSL就是Secure Sockets Layer,是一种安全套接字协议,详情请参考链接中的介绍。<br /> <br /> <br /> <br />配置过程中需要生成一些mak文件,这些生成代码用perl脚本生成,所以要安装一个ActivePerl<br /> <br />ActivePerl:http://www.activestate.com/activeperl/ <br /> <br />openss:http://ww转载 2011-01-12 17:49:00 · 5430 阅读 · 0 评论 -
C++预编译头文件
<br />许多初学 VC 的朋友也许都为那么一个问题困扰过:<br /><br /> 为什么所有的 cpp 都必须 #include "stdafx.h"<br /><br /> 也许请教了别的高手之后,他们会告诉你,这是预编译头,必须包含。可是,这到底<br />是为什么呢?预编译头有什么用呢?<br /><br /> 这得从头文件的编译原理讲起。其实头文件并不神秘,它的全部作用,就是把自己的<br />所有内容直接“粘贴”到相应的 #include 语句处。如果不转载 2011-01-12 14:53:00 · 1056 阅读 · 0 评论 -
[C++] 如何枚举所有打印机
<br />使用API:EnumPrinters();<br /> <br />以下为代码示例:<br />// Use for enum printers<br />#include <Winspool.h><br />#pragma comment(lib, "winspool.lib")<br /> <br />BOOL HasPrinters()<br />{<br /> DWORD Flags = PRINTER_ENUM_FAVORITE | PRINTER_ENUM_LO原创 2011-01-04 11:22:00 · 6122 阅读 · 1 评论 -
CoInitialize()、CoInitializeEx()和AfxOleInit()
<br />CoInitialize()和AfxOleInit()都是初始化COM库,不同之处在与:<br />OLE是建立在COM之上的技术,层次比COM要高。AfxOleInit()调用的是OleInitialize(),而 OleInitialize()除了调用CoInitializeEx()来初始化COM库外,还进行一些其它的操作,这些操作对OLE应用来说是必须的,这些OLE应用包括: <br /> (1)Clipboard; <br /> (2)Drag and转载 2010-12-30 11:03:00 · 2582 阅读 · 0 评论 -
编译指示指令(#pragma)
C和C++的每个实现对它的主机或操作系统都支持一些独有的特征。例如, 某些程序须对存放数据的存储器区域进行精确的控制,或必须控制特定函数接 受参量的方式。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译 指示是机器或操作系统专有的,且对于每个编译器都是不同的。语法#pragma 语言符号字符串语言符号字符串是给出特有编译器指令和参量的字符序列。数字符号(#)必须是包含编译指示行中的第一个非空白字符。空白字符可分开数转载 2010-08-27 22:28:00 · 1323 阅读 · 0 评论 -
初始化const, static, const static, static const成员变量
class MyTestClass{public: MyTestClass() : m_ciInt(1) {} // const成员变量,在ctor参数列表中初始化private: const int m_ciInt; static int m_siInt; const static int m_csiInt;};int MyTestClass::m_siInt = 1; // static成员变量,在外部初始化const int原创 2010-08-27 22:18:00 · 592 阅读 · 0 评论 -
如何使用CppUnit进行单元测试
一、前言 测试驱动开发(TDD)是以测试作为开发过程的中心,它坚持,在编写实际代码之前,先写好基于产品代码的测试代码。开发过程的目标就是首先使测试能够通过,然后再优化设计结构。测试驱动开发式是极限编程的重要组成部分。XUnit,一个基于测试驱动开发的测试框架,它为我们在开发过程中使用测试驱动开发提供了一个方便的工具,使我们得以快速的进行单元测试。XUnit的成员有很多,如JUnit,PythonUnit等。今天给大家介绍的CppUnit即是XUnit家族中的一员,它是一个专门面向C++的测试框转载 2010-08-27 16:20:00 · 1002 阅读 · 0 评论 -
__FILE__,__LINE__,__DATE__,__TIME__,__FUNCTION__
c++有四个常用的预定义名字,分别为:__FILE__,__LINE__,__DATE__,__TIME____FILE__:记录文件的路径加名称__LINE__:记录文件已经被编译的行数__DATE__:记录文件的编译日期__TIME__:记录文件的编译时间可以当作变量直接使用,一般用作程序调试例子:#include using namespace std;int main(){ cout转载 2010-08-11 10:17:00 · 1528 阅读 · 0 评论 -
进阶:使用浮点数和小数中的技巧和陷阱
虽然几乎每种处理器和编程语言都支持浮点运算,但大多数程序员很少注意它。这容易理解 ― 我们中大多数很少需要使用非整数类型。除了科学计算和偶尔的计时测试或基准测试程序,其它情况下几乎都用不着它。同样,大多数开发人员也容易忽略 java.math.BigDecimal 所提供的任意精度的小数 ― 大多数应用程序不使用它们。然而,在以整数为主的程序中有时确实会出人意料地需要表示非整型数据。例如,JDBC 使用 BigDecimal 作为 SQL DECIMAL 列的首选互换格式。IEEE 浮点Java 语转载 2010-08-03 17:09:00 · 1222 阅读 · 0 评论 -
谷歌的C++编码规范,全地球最好没有之一
“我认为这是地球上最好的一份C++编程规范,没有之一,建议广大国内外IT研究使用。”李开复对Google C++编码规范给予了极高的评价。<br />http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml原创 2011-03-08 12:42:00 · 1356 阅读 · 0 评论 -
在VC编译期间打印输出
/////////////////////////////////////////////////////////////////////////////////////////* 来源 Jeffrey Richter 的《Windows 核心编程》(中文)第四版 (机械工业出版社)Page 681.*/#define chSTR2_ZXY(x) #x#define chSTR_ZXY(x) chSTR2_ZXY(x)#define PRA_MSG(desc) message(原创 2011-03-09 17:27:00 · 1456 阅读 · 0 评论