自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(332)
  • 资源 (2)
  • 收藏
  • 关注

转载 标准C++类std::string的内存共享和Copy-On-Write技术

 1、             概念 Scott Meyers在《More Effective C++》中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书。这就是“拖延战术”,

2007-08-13 20:21:00 3721

转载 使用Libxml2操作XML文档

一、Libxml2介绍: Libxml2 是一个xml的c语言版的解析器,本来是为Gnome项目开发的工具,是一个基于MIT License的免费开源软件。它除了支持c语言版以外,还支持c++、PHP、Pascal、Ruby、Tcl等语言的绑定,能在Windows、Linux、Solaris、MacOsX等平台上运行。功能还是相当强大的,相信满足一般用户需求没有任何问题。二、 Libx

2007-08-12 09:24:00 14120 5

转载 libxml库解析XML文件

  绪论Libxml是一个有免费许可的用于处理XML、可以轻松跨越多个平台的C语言库。Libxml实现了读、创建及操纵XML数据功能。    这个指南基于一个简单的XML应用。 数据类型Libxml 定义了许多数据类型,它隐藏了杂乱的来源以致你不必处理它除非你有特定的需要。xmlChar  替代char,使用UTF-8编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到UTF-8才能使

2007-08-12 09:03:00 7396 1

转载 pImpl的原理

城门失火殃及池鱼pImpl惯用手法的运用方式大家都很清楚,其主要作用是解开类的使用接口和实现的耦合。如果不使用pImpl惯用手法,代码会像这样:       //c.hpp        #includeclass C        {        public:            void f1();        private:           

2007-08-11 08:09:00 8019 1

转载 要求或禁止在堆中产生对象

有时我们想这样管理某些对象,要让某种类型的对象能够自我销毁,即“delete this”。很明显这种管理方式需要此类型对象被分配在堆中。而其它一些时候我们想获得一种保障:“不在堆中分配对象,从而保证某种类型的类不会发生内存泄漏。”若在嵌入式系统上工作,就有可能遇到这种情况,发生在嵌入式系统上的内存泄漏是极其严重的,其堆空间是非常珍贵的。有没有可能编写出代码来要求或禁止在堆中产生对象(heap-

2007-08-05 11:05:00 3598 3

转载 限制某个类所能产生的对象数量

 允许建立零个或一个对象每次实例化一个对象时,我们很确切地知道一件事情:“将调用一个构造函数。”事实确实这样,阻止建立某个类的对象,最容易的方法就是把该类的构造函数声明在类的private域:class CantBeInstantiated {private: CantBeInstantiated(); CantBeInstantiated(const CantBeInst

2007-08-05 08:48:00 3137

转载 引用计数

引用计数是这样一个技巧,它允许多个有相同值的对象共享这个值的实现。这个技巧有两个常用动机。第一个是简化跟踪堆中的对象的过程。一旦一个对象通过调用new被分配出来,最要紧的就是记录谁拥有这个对象,因为其所有者--并且只有其所有者--负责对这个对象调用delete。但是,所有权可以被从一个对象传递到另外一个对象(例如通过传递指针型参数),所以跟踪一个对象的所有权是很困难的。象auto_ptr这样的

2007-07-29 13:06:00 9907 5

转载 将构造函数和非成员函数虚拟化

  构造函数虚拟化    从字面来看,谈论“虚拟构造函数”没有意义。当有一个指针或引用,但是不知道其指向对象的真实类型是什么时,可以调用虚拟函数来完成特定类型(type-specific)对象的行为。仅当还没拥有一个对象但是又确切地知道想要的对象的类型时,才会调用构造函数。那么虚拟构造函数又从何谈起呢?     很简单。尽管虚拟构造函数看起来好像没有意义,其实它们有非常大的用处.例

2007-07-29 08:15:00 3156

原创 C++各大有名库的介绍(一)

C++各大有名库的介绍之C++标准库  标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。1、Dinkumware C++ Library参考站点:http://www.dinkumware.com/P.J. Plauger编写的高品质

2007-07-26 20:46:00 6459 1

转载 将 type conversions应用于所有 parameters时,请声明为 non-member functions

我们让 classes 支持 implicit type conversions(隐式类型转换)通常是一个不好的主意。当然,这条规则有例外,最普通的一种就是在创建数值类型时。例如,如果设计一个代表 rational numbers(有理数)的 class,允许从 integers(整数)到 rationals(有理数)的 implicit conversions(隐式转换)看上去没什么不合理的

2007-07-14 08:49:00 2725

转载 避免覆盖(hiding)“通过继承得到的名字”

 C++ 中,我们该用哪种态度对待通过继承得到的名字.事情的实质与继承没什么关系。它与作用域有关。我们都知道它在代码中是这样的,int x;                        // global variablevoid someFunc(){  double x;                   // local variable  std::cin >> x

2007-07-08 18:26:00 2600

转载 感受Template Meta Programming

  Template Meta Programming (TMP)(模板元编程)是写 template-based(基于模板)的运行于编译期间的 C++ 程序的过程。考虑一下:一个 template metaprogram(模板元程序)是用 C++ 写的运行于 C++ 编译器中的程序。当一个 TMP 程序运行完成,它的输出——从 templates(模板)实例化出的 C++ 源代码片断——随后

2007-07-08 11:41:00 2920

转载 考虑支持一个 non-throwing swap(不抛异常的 swap)

SWAP 是一个有趣的函数。最早作为 STL 的构件被引入,后来它成为 exception-safe programming(异常安全编程)的支柱和压制自赋值可能性的通用机制。因为 swap 太有用,所以适当地实现它非常重要,但伴随它的不同寻常的重要性而来的,是一系列不同寻常的复杂性。 swap(交换)两个 objects 的值就是互相把自己的值送给对方。缺省情况下,经由标准的 swa

2007-07-08 09:08:00 2995

转载 只要有可能就推迟 variable definitions(变量定义)

 只要你定义了一个带有 constructor(构造函数)或 destructor(析构函数)的类型的变量,当控制流程到达变量定义的时候会使你担负构造成本,而当变量离开作用域的时候会使你担负析构成本。如果这一成本关联到无用变量,你就要尽你所能去避免它。 你或许认为你从来不会定义无用变量,但是也许你应该再想一想。考虑下面这个函数,只要一个 password 足够长,它就返回这个 pass

2007-07-08 08:18:00 2475

转载 了解Inline

  Inline functions 看起来像 functions,产生的效果也像 functions,它们在各方面都比 macros(宏)好得多,而我们却可以在调用它们时不招致函数调用的成本。 实际上我们得到的可能比想到的更多,因为避免函数调用的成本只是故事的一部分。编译器的优化一般说是为了一段连续的没有函数调用的代码设计的,所以当我们inline 一个函数时,我们就使得编译器对函数

2007-07-08 00:39:00 2875

转载 若不想使用 compiler-generated functions(编译器生成函数)请明确拒绝

 房地产代理商出售房屋,服务于这样的代理商的软件系统自然要有一个 class(类)来表示被出售的房屋:class HomeForSale { ... }; 每一个房地产代理商都会很快指出,每一件房产都是独特的——没有两件是完全一样的。在这种情况下,为 HomeForSale object(对象)做一个 copy(拷贝)的想法就令人不解了。怎么能拷贝一个独一无二的东西呢?因此最好

2007-07-07 18:55:00 2771

转载 polymorphic base classes(多态基类)中将 destructors声明为 virtual

 程序开发部中有很多方法取得时间,所以有必要建立一个 TimeKeeper base class(基类),并为不同的计时方法建立 derived classes(派生类):class TimeKeeper {public:  TimeKeeper();  ~TimeKeeper();  ...};class AtomicClock: public TimeKeeper { ...

2007-07-07 16:32:00 2616

原创 谨慎使用 multiple inheritance(多继承)

触及 Multiple Inheritance (MI)(多继承)时,C++ 社区就会鲜明地分裂为两个基本的阵营。一个阵营认为如果 single inheritance (SI)(单继承)是有好处的,multiple inheritance(多继承)一定更有好处。另一个阵营认为 single inheritance(单继承)有好处,但是多继承引起的麻烦使它得不偿失。首要的事情之一是要承认当

2007-07-07 07:35:00 2954

转载 用 member function templates 接受 "all compatible types"

smart pointers(智能指针)是行为很像指针但是增加了指针没有提供的功能的 objects。例如,标准 auto_ptr 和 tr1::shared_ptr 是被应用于在恰当的时间自动删除的 heap-based resources(基于堆的资源)的。STL containers 内的 iterators(迭代器)几乎始终是 smart pointers(智能指针);绝对不能指望用

2007-07-01 20:18:00 2612

转载 通过 composition模拟 "has-a"或 "is-implemented-in-terms-of"

Composition(复合)是在 objects of one type(一个类型的对象)包含 objects of another type(另一个类型的对象)时,types(类型)之间的关系。例如:class Address { ... };             // where someone livesclass PhoneNumber { ... };class Person {p

2007-07-01 09:03:00 2803

转载 谨慎使用 private inheritance

将 public inheritance(公有继承)视为一个 is-a 关系。当给定一个 hierarchy(继承体系),其中有一个 class Student 从一个 class Person 公有继承,当为了成功调用一个函数而必需时,就要将 Students 隐式转型为 Persons,它通过向编译器展示来做到这一点。用 private inheritance(私有继承)代替 public i

2007-07-01 08:13:00 1759

转载 理解 implicit interfaces和 compile-time polymorphism

 Object-Oriented Programming(面向对象编程)的世界是围绕着 explicit interfaces(显式接口)和 runtime polymorphism(执行期多态)为中心的。例如,给出下面这个(没有什么意义的)class(类)class Widget {public:  Widget();  virtual ~Widget();  virtual std::si

2007-07-01 07:31:00 880

转载 make和Makefile文件

无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果每次都要键入

2007-06-30 10:19:00 851

转载 区分 inheritance of interface(接口继承)和 inheritance of implementation(实现继承)

(public) inheritance 这个表面上简单易懂的观念,一旦被近距离审视,就会被证明是由两个相互独立的部分组成的:inheritance of function interfaces(函数接口的继承)和 inheritance of function implementations(函数实现的继承)。这两种 inheritance 之间的差异正好符合function declarati

2007-06-30 08:51:00 886

转载 考虑可选的 virtual functions(虚拟函数)的替代方法

 假设为视频游戏中角色设计了一个 hierarchy(继承体系)。游戏中有着变化多端的恶劣环境,角色被伤害或者其它的健康状态降低的情况并不罕见。因此决定提供一个 member function(成员函数)healthValue,它返回一个象征角色健康状况如何的整数。因为不同的角色计算健康值的方法可能不同,将 healthValue 声明为 virtual(虚拟)似乎是显而易见的设计选择:c

2007-06-30 08:06:00 1020

转载 最小化文件之间的 compilation dependencies(编译依赖)

我们进入到某个C++ 程序中,对一个 class 的 implementation(实现)进行了细微的改变。不是 class 的 interface(接口),只是 implementation(实现),仅仅是 private 的东西。然后 rebuild(重建)这个程序,预计这个任务应该只花费几秒钟。毕竟只有一个 class 被改变。点了一下 Build 或者键入 make(或者其它类似的事情),

2007-06-24 21:17:00 979

转载 争取 exception-safe code(异常安全代码)

 假设我们有一个 class,代表带有背景图像的 GUI 菜单。这个 class 被设计用于一个 threaded environment(多线程环境),所以它有一个用于 concurrency control(并发控制)的 mutex(互斥体):class PrettyMenu {public:  ...  void changeBackground(std::istream& imgSrc

2007-06-24 16:59:00 3007

转载 虚继承与虚基类的本质

    虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然这两个概念的定义是非常的简单明确的,但是在C++语言中虚继承作为一个比较生僻的但是又是绝对必要的组成部份而存在着,并且其行为和模型均表现出和一般的继承体系之间的巨大的差异(包括访问性能上的差异),现在我们就来彻底的从语言、模型、性能和应用等多个方面对虚继承和虚基类进行研究。    首先还是先给出虚继承和虚基

2007-06-23 08:33:00 1950

转载 C中的常用宏技巧

防止一个头文件被重复包含#ifndef COMDEF_H #define COMDEF_H   //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 typedef  unsigned char      boolean;     /* Boolean value type. */   typedef

2007-06-23 07:25:00 762

原创 设计模式的设计原则

单一职责原则(SRP):– 一个类应该仅有一个引起它变化的原因。开放封闭原则(OCP):– 类模块应该是可扩展的,但是不可修改(对扩展开放,对更改封闭)Liskov 替换原则(LSP):– 子类必须能够替换它们的基类. 依赖倒置原则(DIP):– 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。– 抽象不应该依赖于实现细节,实现细节应该依

2007-06-18 23:27:00 717

原创 Singleton的各种实现

  标准实现//这是设计模式书中讲到的实现class Singleton{public: static Singleton* Instance(void) {  if(NULL==instance_)  {   instance_ = new Singleton;  }  return instance_; }private: Singleton(void){} ~Singleton(void

2007-06-17 10:43:00 711

转载 模板特化类型

 模板特化的几种类型,一是特化为绝对类型; 二是特化为引用,指针类型;三是特化为另外一个模板类。 这里用一个简单的例子来说明这三种情况:templateclass Compare{public:    static bool IsEqual(const T& lh, const T& rh)    {        return lh == rh;    }};这是一个用于比较的模板类,里面可

2007-06-17 09:22:00 875

转载 C++对象对内存的使用

我们知道,程序=代码+数据。若按照这个等式,一个C++程序在内存的中分配方式如下:1,全局/静态变量存储区;[数据] 2,常存储区;[数据] 3,代码区;[代码] 4,栈;[数据] 5,堆;[数据] 我们写一小段代码测试一下;(Platform:winXp + vc6.0) ----------------------------------------------------------#inc

2007-06-17 08:14:00 1335 1

原创 解决友元不可继承的技巧

我们知道,一个类A声明为一个类B的友元类之后,类A就可以任意访问类B的所有成员(公有的、保护的和私有的)。但是,如果一个类D继承自类B,类B中的友元关系并不会被继承,也就是说,类A是类B的友元但却不是类B的派生类D的友元。即类A不可以访问类D的保护的和私有的成员。请看如下代码:  #include ios

2007-06-17 07:45:00 1045

转载 基类握住派生类指针

握住派生类指针是指拥有一个派生类指针的成员,暂且不谈这样做干什么,先来看一下如何这样做 // sample1.cpp#include #include #include string>using namespace std;class derived;class base{public:    base()  {        p = static_cast(this);     }   

2007-06-16 14:39:00 909

转载 尽量使用非成员非友元函数,而不是成员函数

    

2007-06-16 09:59:00 821

转载 Python介绍

Python(发音:[ paiθ(ə)n; (US) paiθɔn ]),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行。目前,基于这种语言的相关技术正在飞速的

2007-06-14 10:57:00 716

转载 COM原理及应用---- COM发展——COM+

1、COM+       由于历史的原因,COM、DCOM和MTS相互之间并不很融洽,难以形成统一的整体。COM+把这三者有效地统一起来,形成了一个全新的、功能强大的组件体系结构。       COM+并不是COM的新版本,而是COM的新发展,或者COM更高层次上的应用。COM +的底层结构仍然以COM为基础,它几乎包容了COM的所有内容。COM+把组件软件提升到应用层而不是底层的软件结构

2007-06-13 23:21:00 1099

转载 COM原理及应用---- 基于COM的程序设计

1、COM的作用       COM作为一种软件模型,提供了程序之间通信的标准,但其最大的贡献在于对程序设计方法的变革。COM结合了对象技术和组件技术两种特性。对象特性使得应用系统的设计和实现更加符合现实世界的面貌;组件特性使得应用系统可以充分发挥组件的优势,以适应现代应用的需要。 2、组件的特性       组件之间可以在二进制级别上进行集成和重用;组件必须被独立地生产、获得和配

2007-06-13 23:16:00 757

转载 COM原理及应用---- ActiveX控制

1、ActiveX控制       ActiveX控制是Microsoft提供的功能强大的程序设计和开发技术。ActiveX控制既是一个自动化对象(当然也是一个标准的COM对象),也是一个界面元素,如同Windows的普通控制一样。       ActiveX控制是一门综合技术,它涉及到COM和OLE的许多技术精华,同时也与Windows操作系统紧密结合起来,它可作为Windows标准控制

2007-06-13 23:04:00 1064

设计之道--设计之道

设计之道--设计之道 设计之道--设计之道 设计之道--设计之道

2008-12-12

捉虫历险记——常见C++Bug大围剿

捉虫历险记——常见C++Bug大围剿

2008-02-13

空空如也

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

TA关注的人

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