自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

享受开发技术,享受计算机科学

自问自己:拥有的技术能应用到什么程度,能创造多大的价值

  • 博客(199)
  • 收藏
  • 关注

原创 谈windows开发学习过程

谈学习

2014-04-02 18:16:37 2325

原创 设计模式书籍推荐

1.名称 : Head First Design Patterns语言 : java评论 : Jolt大奖得主,介绍了常见的十几种模式。我认为最好的模式入门书籍,内容生动,风格活泼。如果对模式了解较少,看这本书最合适不过,即使你水平不错,相信看了也会有收获。推荐 : 五星2.名称 : 深入浅出设计模式(C++版)语言 : C++评论 : 和上本书风格相似,语

2014-03-28 19:25:09 2125

原创 C++ 学习建议

C++缺点之一,是相对许多语言复杂,而且难学难精。C++的优点就是即能接触底层也可用于上层开发。我是从C进入C++,皆是靠阅读自学。在此分享一点学习心得。个人认为,学习C++可分为4个层次:第一层次,C++基础:挑选一本入门书籍,如《C++ Primer》、《Essential c++》、或Stroustrup撰写的经典《C++程序设计语言》或他一年半前的新作《C++程序设计原理与实践

2014-03-28 16:15:12 1937

原创 导致数据库中数据不一致的根本原因

数据库中很有可能存在不一致的数据。 一般导致数据库中数据不一致的根本原因有三种情况。第一种是数据冗余造成的,第二种是并发控制不当造成的,第三种是由于某种原因(比如软硬件故障或者操作错误)导致数据丢失或数据损坏。 让我们具体讲讲这三种情况:第一种情况:数据冗余假如数据库中两个表都放了用户的地址,在用户的地址发生改变时,如果只更新了一个表的数据,那么两个表就有了不一致的数据。

2014-03-01 12:46:56 12096

原创 面向对象编程的六大原则

一、单一职责原则: 全称:“Single-Responsibility Principle”说明:就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因。所谓职责,我们可以理解他为功能,就是设计的这个类功能应该只有一个,而不是两个或更多。也可以理解为引用变化的原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑撤分这个类了。因为职责是变化的一个轴线,当需求变化时,该变化会反映

2013-09-29 13:09:24 1865

原创 C++不一定提供默认构造函数

有四种情况,会导致“编译器必须为未声明constructor之classes合成一个default constructor”。C++ Stardand 把那些合成物称为implicit notrivial default constructors。被合成出来的constructor 只能满足编译器(而非程序)的需要。它之所以能够完成任务,是借着“调用member object 或 base cla

2013-09-27 18:43:08 1995

原创 一个空的class

一个空的class 如://sizeof X==1class X{};事实上并不是空的,它有一个隐晦的1byte,那是被编译器安插进去的一个char.这使得这个class的两个object得以在内存中配置独一无二的地址。

2013-09-27 09:57:34 1847

原创 计算机科学中最重要的32个算法

奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结果,按照英文名称字母顺序排序。A* 搜索算法——图形搜索算法,从给定起点到给定终点计算出路径

2013-09-25 00:02:06 1766

原创 设计模式与程序框架

什么是模式模式,即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。当一个领域

2013-09-23 21:24:37 1802

原创 为“异常安全”而努力是值得的

一.异常安全函数(Exception-safe function)即使发生异常也不会泄露资源或允许任何数据结构败坏,这样的函数区分为三种可能的保证:基本型、强烈型、不抛出异常型。1)基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效状态,没有任何对象或数据结构会因此而败坏,所有对象都处于一个内部前后一致的状态(例如所有的classes约束条件都继续获得满足)。然后程序的现实状态(exac

2013-09-18 17:36:57 1976

原创 给std::swap添加新版本的swap模板

#include using namespace std;namespace WidgetStuff{ template class WidgetImpl { public: WidgetImpl(const T& a); void print()const; private: T m_a; }; template WidgetImpl::WidgetImpl

2013-09-18 11:26:19 1202

原创 STL之tuple

//将表示人的数据打包struct Human{ string strName; unsigned int nAge; double fWeight;};vector vecHuman;一个vector容器保存多组数据的问题,但是也需要在代码中定义多个结构体,如果结构体过多,就会使得代码显得繁杂,STL中的tuple就解决这问题:跟结构体可以打包多个数据类似

2013-09-18 09:53:41 1483

原创 STL之迭代器的使用注意事项

情况一:循环遍历删除基于连续内存的容器中的元素//错误代码:for (vector::iterator iter=vecSalary.begin(); iter != vecSalary.end(); ++iter) { if(*iter < 2) { vecSalary.erase(iter); } }我们来仔细分析下,在删除某个元素时,

2013-09-18 09:18:02 1256

原创 c++虚继承对象的内存布局

好了,我们从最基础的的讨论起。当c++支持virtual base class 时,就会多了一些额外负担,当class 中内含一个或多个virtual base class subobject时,将分成两个部分,一个不变局部和一个共享局部。最初的方案是为每一个虚基类安插一个指针指向这个虚基类,其缺点是为了负担太重,而且当虚继承链加长时,导致间接存取时间加长(需通过多次跳转)。因此有两种解决方案(《

2013-09-17 20:56:38 843

原创 探索C++对象模型之 多重继承与虚函数表

Code#include using namespace std;class B1{public:    int x;    virtual void v1(){ cout     void f1(){cout };class B2{public:    int y;    virtual void v2(){ cout

2013-09-17 12:26:43 807

原创 std::tr1::function

在C++的TR1中(Technology Report)中包含一个function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。可以参考Scott Meyers. >. Item 35.下面具体说明其使用方法。一、指向全局函数或静态成员函数时因为在本质上讲全局函数和静态成员函数没有区 别,使用方法上除了

2013-09-16 21:56:48 738

原创 浅谈编程解决实际问题的常见思想(转载)

现实生活中有很多问题,人为不好解决,但利用计算机速度快,不出错的特性,可以很方便的解决这些问题,下面简单说说我在程序设计中解决实际问题的一些常见思想,高手可以忽略掉,我也是无聊了随便写写而已。  1、枚举最优解时的情况  有很多问题初看很棘手,但经过仔细的分析,可以得出一些显然的结论。  比如下面这个问题: 平面内有上千个点,用一个半径为R的圆去覆盖,最多能覆盖多少点?

2013-09-16 21:21:18 994

原创 boost::function 用来注册函数(switch N多case的解决方案)

在现在做的游戏开发的项目中,需要根据道具类型调用不同的接口,通常的写法是用switch(itemType){ case ...; case ...;...}这样写的话,如果将来有新增情况会导致case越来越多 ,不好。正好项目中使用了boost库,结果想了个解决方案: typedef boost::function TypeOnUseI

2013-09-16 21:15:13 901

原创 函数调用方式解析

1._cdecl是C Declaration的缩写,表示C语言默认的函数调用方法:所有参数 从右到左依次入栈,这些参数由调用者清除,称为手动清栈(由调用者把参数弹出栈)。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。被调用函数无需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。    _cdecl是

2013-09-16 20:22:00 809

原创 函数调用机制与调用约定(转载)

1.示例栈的作用和功能这里就不再叙述了。先看一个最简单的函数调用例子:#include "stdafx.h"int call(int _a,int _b);void _tmain(){ int a=1; int b=2; int c=call(a,b);}int call(int _a,int _b){ return _a+_b;}m

2013-09-16 19:21:11 808

原创 STL容器选择

经常听到有人抱怨STL性能不好,不排除你的公司十分牛X而且对性能要求极高,至少我想绝大多数企业和工程师自己写不出比STL更好的库,如果你不相信,请先看看《STL源码剖析》这本书。我想大多数情况是你没有选择对相应的容器和没有正确的使用。容器分类标准STL序列容器:vector,string,deque,list;标准STL关联容器:set,multiset,map

2013-09-14 22:27:27 701

原创 STL基础篇(适合初学者快速入门)

1.       STL 是什么作为一个C++ 程序设计者,STL 是一种不可忽视的技术。Standard Template Library (STL) :标准模板库, 更准确的说是 C++ 程序设计语言标准模板库。STL 是所有C++ 编译器和所有操作系统平台都支持的一种库,说它是一种库是因为,虽然STL 是一种标准,也就是说对所有的编译器来说,提供给C++ 程序设计者的接口都是一样

2013-09-14 11:52:39 7561 2

原创 智能指针boost::weak_ptr

【1】boost::weak_ptr简介boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include便可以使用。【2】boost::weak_ptr详解智能指针boost::scope_ptr和智能指针boost::shared_ptr就完全可以解决所有单个对象内存的管理问题。这儿咋还多出一个boost::weak_ptr,是

2013-09-14 11:04:31 722

原创 智能指针boost::shared_ptr

【1】boost::shared_ptr简介boost::shared_ptr属于boost库,定义在namespace boost中,包含头文件#include便可以使用。上篇boost::scoped_ptr中我们看到boost::scoped_ptr独享所有权,不允许赋值、拷贝。而boost::shared_ptr是专门用于共享所有权的,由于要共享所有权,其在内部使用了引用计数机

2013-09-14 10:58:40 1078

原创 智能指针boost::scoped_ptr

【1】boost::scoped_ptr简介boost::scoped_ptr属于boost库,定义在namespace boost中,包含头文件#include 便可以使用。一句话:一个作用域指针(即所谓智能指针scoped_ptr对象)独享一个动态分配的内存对象管理所有权。【2】boost::scoped_ptr与stl::auto_ptr的联系boost::scoped_pt

2013-09-14 10:40:43 724

原创 资源共享型智能指针实现方式简述

资源共享型智能指针实现方式简述资源共享型的智能指针有两种实现方式:一种是侵入式;一种是非侵入式。网上以及书籍比较常见的是非侵入式的,它的实现完全放在智能指针模板类内。模板类有一个用于保存资源类对象的指针变量和一个用于记录资源对象引用计数的指针变量。两者是所有的智能指针对象共享的,所以通过指针保存。侵入式则不同,它的实现分散在智能指针模板和使用资源对象类中:模板类只有

2013-09-14 10:39:18 1063

原创 值语义与对象语义

【1】什么是值语义?所谓值语义是指目标对象由源对象拷贝生成,且生成后与源对象完全无关,彼此独立存在,改变互不影响。就像 int 类型变量相互拷贝一样。C++的内置类型(bool/int/double/char)都是值语义,标准库里的 complex、vector、string 等等类型也都是值语义。拷贝之后就与源对象完全脱离关系。【2】什么是对象语义?对象语

2013-09-12 19:41:04 957

原创 位操作小结

位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算).位运算符[编辑]取反(NOT)[编辑]取反是一元运算符, 对一个二进制数的每一位执行逻辑反操作. 使数字1成为0, 0成为1. 例如:

2013-09-12 14:19:25 569

翻译 如何编写高质量的代码——来自《代码大全(第2版)》的启示

软件的首要技术使命是管理复杂度,计算先驱Edsger Dijkstra指出,只有在“计算(Computing)”这种职业中,人的思维需要从一个字节大幅跨越到几百兆字节——跨度为109比1,也就是9个数量级[1]。Dijkstra还指出,没有谁的大脑能容得下一个现代的计算机程序,也就是说,作为软件开发人员,我们不应该试着在同一时间把整个程序都塞进自己的大脑,而应该试着以某种方式去组织程序,以便能够在

2013-09-11 18:44:03 705

原创 typedef关键字

typedef通常被用于以下三种目的:为了隐藏特定类型的实现,强调使用类型的目的。简化复杂的类型定义,使其更易理解。允许一个类型用于多种目的,同时使得每次使用该类型的目的明确。【2】关于typedef使用应该注意哪些问题?(1)typedef使用举例。示例代码如下:#includeusing namespace std;void main()

2013-09-04 15:12:43 665

原创 再次理解封装继承多态

诸位周知,计算机是对现实世界的一种模拟,现在从严格意义而言,其实同时更是一种扩充。编程语言是程序员通过编译器与计算机进行沟通的一种工具。C++编程语言是面向对象的设计理念,也就是以对象为核心。那么,为了能达到代码的复用性,在建立对象之前,必须要抽象设计一个对象的雏形,对头,这个雏形就是所谓的类的概念。设计类时,从宏观上分析,每一类事物包括各类事物其之间都是高

2013-09-03 00:29:02 747

原创 浅析:智能指针

【1】认识智能指针什么是智能指针?根据面向对象编程的思想,智能指针肯定也是一种对象。好吧!那么,既然是对象,肯定就有对应的类。而所构建智能指针对象的类即就是它的核心内容。简而言之,所构建智能指针对象的类是有且仅有一个指针成员变量的类。智能指针的潜规则就是所谓的这个唯一的指针成员变量肯定指向一个在堆上创建的对象。所以,智能指针本质是存储动态分配(堆上创建)对象

2013-09-02 22:44:58 710

原创 用C++ 写一个不能被继承的类

条件:用C++写一个不能被继承的类,但这个类既可以在栈上实例化也可以在堆上实例化。如果一个类不能被继承,我第一想到的是这个类的构造函数为private.如果要可以在堆上实例化,我就想到使用静态成员函数模拟构造函数的功能,内部创建堆上对象。再使用静态成员函数负责释放动态分配的对象。使用静态成员函数也可以创建静态数据区上的对象。但是这种方法不能在栈上实例化。所以方法不行,继续想!

2013-09-02 15:43:09 838

原创 C++ 限制类对象的数量的方法

如何禁止产生类对象呢?只要将类的构造函数用private修饰即可。那么,如何限制类只能产生一个类对象呢?只要借助于友元函数的static对象即可。示例代码如下:class Printer { private: Printer() { cout<<"thePrinter constructed"<<endl; }

2013-09-02 14:33:21 1233 1

原创 送给初学者:浅谈面向过程与面向对象

【1】面向过程“面向过程”是一种以过程为中心的编程思想(我怎么老觉得这是一句屁话!没办法,我们的教科书它就是这么“高雅”!)。“面向过程”也可称之为“面向记录”编程思想(这句话似乎具体了一步,但是还是不怎么清楚。肿么办?再查资料呗!)。我们知道计算机莫非就是对现实世界的模拟。那所谓的这种思想肯定可以映射或者说等价于现实中的具体情形。哦,我知道了!面向过程即就是直接对

2013-09-02 09:31:11 824

原创 杂谈:智能指针与库

最近看一些库时发现仅指针一项就有挺多封装, 思考为什么需要智能指针?通过智能指针可以以RAII的方式管理对象, 编写异常安全的代码; 原始的指针没有标明对象所有权的情况, 对象是你单独拥有的?还是你和别人共享对象, 但是你也参与管理? 还是你只是使用对象,但是没有所有权? 智能指针很好的解决了这些问题。下面是一些常见的智能指针封装形式:std::auto_ptr基于所有权的

2013-08-28 16:11:02 633

原创 C++中基于Crt的内存泄漏检测

尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询。#ifdef _DEBUG#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#inclu

2013-08-28 15:45:19 735

原创 C语言高效编程的的四大绝招(转载)

引言:编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。第一招:以空间换时间计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。例如:字符串的赋值。方法A:通常的办法:#define LEN 32char string1

2013-08-28 14:21:36 615

原创 C++ string 用法详解

任何人对本文进行引用都要标明作者是Nicolai M.Josuttis///////////////////////////////////////////////////////////////////////////////////C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来

2013-08-28 13:18:21 673

原创 如何使用set::key_comp 和 set::value_comp 标准模板库 (STL) 函数

下面的代码示例演示如何使用 Visual C++ set::key_comp 和 set::value_comp 的 STL 功能。所需要的头文件:原型 template class set { public: // Function 1: key_compare key_comp() const;

2013-08-27 14:09:56 3802

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除