自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(65)
  • 资源 (1)
  • 收藏
  • 关注

原创 ubuntu linux下安装boch过程

ubuntu linux boch

2010-06-10 23:06:00 618

原创 计算机启动过程

系统运行必须是从rom的0x0开始的,因此应该利用remap把放中断向量的初始地址映射到rom的0x0处,以使程序进行正确的初始化.这样既可以初始化,有可以使程序运行的快一些,因为毕竟rom的速度是比较慢的. 第二个基本概念是内存的地址,我们的机器中一般安装有32MB、64MB或128MB内存,这些内存的每一个字节都被赋予了一个地址,以便CPU访问内存。32MB的地址范围用十六进制数表示就是

2009-11-05 23:11:00 102

转载 关于Vc编译选项

许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more multiply defined symbols found这样的链接错误,而且通常是在使用第三方库时遇到的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,那么本文就试图为大家彻底解开关于它的种种疑惑。   大家都知道,从C/C++

2009-01-03 18:26:00 3379 3

原创 GIF文件格式详解

GIF是图像交换格式(Graphics Interchange Format)的简称,它是由美国CompuServe公司在1987年所提出的图像文件格式,它最初的目的是希望每个BBS的使用者能够通过GIF图像 文件轻易存储并交换图像数据,这也就是它为什么被称为图像交换格式的原因了。 GIF文件格式采用了一种经过改进的LZW压缩算法,通常我们称 之为GIF-LZW算法。这是一种无损的压缩算法,压缩效

2008-12-21 16:05:00 1407

转载 BAT编写详细手册 ( 转载 )

首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来

2008-12-21 15:03:00 6734 2

原创 VC项目文件说明

VC项目文件说明  .dsp 项目参数配置文件,这个文件太重要,重点保护对象。. .dsw 工作区文件,重要性一般,因为它信息不我,容易恢复。  以下文件在项目中是可丢弃的,有些文件删除后,VC会自动生成的。 .clw ClassWizard信息文件,实际上是INI文件的格式,有兴趣可以研究一下.有时候ClassWizard出问题,手工修改CLW文件可以解决.如果此文件不存在的话,

2008-12-21 13:46:00 398

原创 函数调用约定导致的常见问题

在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参

2007-09-09 22:47:00 480

原创 JDBC基础

一个JDBC的基本程序应该包括如下步骤: 1,加载必要的类 import java.sql.*;               import com.borland.dx.sql.dataset.*; import com.borland.dbswing.*; 2,加载JDBC驱动程序 要通过JDBC来连接数据库,应用程序必须加载合适的JDBC驱动程序,这样才可能建立与数据库的连接。 DriverM

2007-06-29 23:02:00 701

原创 GDI对象使用过程

 GDI对象要选入Windows 设备描述表后才能使用;用毕,要恢复设备描述表的原GDI对象,并删除该GDI对象。 一般按如下步骤使用GDI对象:  Create or get a GDI OBJECT hNewGdi; hOldGdi = ::SelectObject(hdc, hNewGdi)……::SelectObject(hdc, hOldGdi)::D

2007-05-15 15:50:00 761

原创 CDC派生出的设备描述表

      从CDC 派生出四个功能更具体的设备描述表类。层次如图所示。下面,分别讨论派生出的四种设备描述表。   CCientDC   代表窗口客户区的设备描述表。其构造函数CClientDC(CWnd *pWin)通过::GetDC获取指定窗口的客户区的设备描述表HDC,并且使用成员函数Attach把它和CClientDC对象捆绑在

2007-05-15 15:41:00 1181

原创 使用设备描述表的步骤

要使用设备描述表,一般有如下步骤:   获取或者创建设备描述表;     必要的话,改变设备描述表的属性;     使用设备描述表完成绘制操作;     释放或删除设备描述表。   Common设备描述表通过::G

2007-05-15 14:36:00 761

原创 在MFC下创建一个窗口对象

MFC下创建一个窗口对象分两步,首先创建MFC窗口对象,然后创建对应的Windows窗口。在内存使用上,MFC窗口对象可以在栈或者堆(使用new创建)中创建。具体表述如下:     创建MFC窗口对象。通过定义一个CWnd或其派生类的实例变量或者动态创建一个MFC窗口的实例,前者在栈空间创建一个MFC窗口对象,后者在堆空间创建一个MFC窗口对象。  

2007-05-15 14:20:00 1536

原创 用SDK编写各种Windows应用程序的规律

           用SDK的Win32 API编写各种Windows应用程序,有其共同的规律:首先是编写WinMain函数,编写处理消息和事件的窗口过程WndProc,在WinMain里头注册窗口(Register Window),创建窗口,然后开始应用程序的消息循环。

2007-05-11 21:01:00 624

原创 MFC Object和Windows Object的关系

         MFC中最重要的封装是对Win32 API的封装,因此,理解Windows Object和MFC Object (C++对象,一个C++类的实例)之间的关系是理解MFC的关键之一。所谓Windows Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象;所谓MFC Object (MFC对象)是C++对象,是一个C++类的实例,这里(本书范围内)

2007-05-11 20:34:00 1159 2

转载 计算几何算法(含源代码)

㈠ 点的基本运算 1. 平面上两点之间距离 1 2. 判断两点是否重合 1 3. 矢量叉乘 1 4. 矢量点乘 2 5. 判断点是否在线段上 2 6. 求一点饶某点旋转后的坐标 2 7. 求矢量夹角 2 ㈡ 线段及直线的基本运算 1. 点与线段的关系 3 2. 求点到线段所在直线垂线的垂足 4 3. 点到线段的最近点 4 4. 点到线段所在直线的距离 4 5. 点到折线集的最近距离 4 6.

2007-05-07 16:50:00 3690

原创 如何编写ToolBar的ButtonClick事件

 1,在编写ToolBar的ButtonClick事件时,可能会产生疑问,因为在vs 2003中ToolBar上button的没有自己的click事件。下面是事件响应函数的框架protected void toolBar1_ButtonClick ( Object sender, ToolBarButtonClickEventArgs e)          {   // e.Button

2007-04-25 21:13:00 3277 1

原创 Effective C++读书笔记之透彻了解inlining的里里外外

        首先要明确一点,inline函数是c++提供的一个好的方法。可是我们要注意inline函数的概念是,将对函数的每个调用都以函数本体替换之。这样做可能增加你的目标码(object code)大小。在一个内存较小的机器上,这可能降低指令高速缓存的击中率。      记住,inline只是对编译器的一个申请,不是强制命令。它可以隐喻提出,也可以明确提出。隐喻方式是把函数定义在class定

2007-04-20 22:00:00 527

原创 Effective C++读书笔记之为“异常安全”而努力是值得的

先来看一段代码,假设有一个class用来表现夹带背景图案的GUI菜单 class PrettyMenu { public:  .....  void changeBackground(std::istream& imgSrc); //改变背景图案 private:  Mutex mutex;         //互斥器 用于多线程环境  Image* bgImage;      //目前的背景图像

2007-04-20 14:21:00 611

原创 Effective C++读书笔记之避免返回handles指向对象内部成分

 我们举个例子来看这个条款面临的问题 设计一个表示矩形的类,为了让这个类尽量的小,可以不把表示矩形的点放在这个类中,而是放在一个struct中,在类中指向它。 class Point {          //表示点的类 public:  Point(int x, int y);  .....  void setX(int newVal);  void setY(INT newVal); }; s

2007-04-19 21:17:00 901

原创 Effective C++读书笔记之尽量少做转型动作

 回顾一下转型语法: 1) C风格的转型动作 (T)expression  //将expression转型为T 2) 函数风格的转型动作: T(expression)  //将expression转型为T 这两种形式没有差别,只是小括号的位置不同。我称此二种形式为旧工转型(old-style casts) 3) C++风格的转型动作,也称为new-style 或 C++-style casts。它

2007-04-19 14:12:00 596

原创 Effective C++读书笔记之尽量延后变量定义式的出现时间

      只要你定义了一个变量而其类型带有一个构造函数和析构函数,你就要承受构造和析构成本。有时这个变量最终并未被使用,这就是一种浪费了。你可能会说我不可能定义一个不使用的变量。哈哈  看看下面的代码例子,有时这种不使用不是由你故意造成的。 有一个计算通行密码的加密版本而后返回,前提是密码够长,否则函数会抛出一个异常。如下: //这个函数过早定义变量"encrypted" std::string

2007-04-19 10:05:00 464

原创 Effective C++读书笔记之考虑写出一个不抛异常的swap函数

swap是个有趣的函数。原本它只是STL的一部分,可是它成为异常安全性编程的脊柱,以及用来处理自我赋值的一个常见机制。可以看到swap函数的重要性。所以我们要讨论一下它的复杂度。 缺省情况下swap是由标准程序库提供的swap算法完成的,如下: namespace std {  template        //std::swap的典型实现  void swap(T& a, T&b)  {   

2007-04-18 17:47:00 662

原创 Effective C++读书笔记之若所有参数皆需类型转换,请为此采用non-member函数

举个例子来说明我们这次要面对的问题: 设计一个class用来表现有理数,它应该支持隐式类型转换,虽然我们说令classws支持隐式类型转换通常是个不好的主意。这是为了我们设计的类可以和内置类型进行运算。例如和整型。 class Rational { pbulic:  Rational(int numerator = 0, int denominator = 1); //注意这个构造函数不为expl

2007-04-17 21:59:00 798

原创 Effective C++读书笔记之宁以non-member、non-friend替换member函数

面对的问题: 举个例子来看我们要面对的问题, 有一个class用来表示网页浏览器。 class WebBrowser { pbulic:  ....  void clearCache();    //清除下载高速缓存区(cache of downloaded elements)  void clearHistory();  //清除访问过的URLs的历史记录(history of visited

2007-04-16 17:40:00 1024

原创 Effective C++读书笔记之将成员变量声明为private

 不使用public成员变量可以有很多的好处。 1) 语法一致性。当成员变量是private时,你只能通过函数访问它们。那么对类的成员的调用都需要带"()"了 2) 可以提供访问控制。如果成员变量为public时,每个人都可以访问它们。当为private时,你可以实现只读,只写等的访问。 3) 类的封装。如果你通过函数访问成员变量,可以为所有的可能的实现提供弹性。public意味着不封装。 注意:

2007-04-16 15:02:00 524

原创 Effective C++读书笔记之必须返回对象时,别妄想返回其reference

      上节我们说使用pass-by-reference-to-const比pass-by-value效率高,可是有时候为了得到正确的结果,我们必须使用pass-by-value。如果一味的使用pass-by-reference-to-const,可能会犯下一个致命的错误:开始传递一些reference指向其实并不存在的对象。 下面的例子说明了,在特定的情况下,使用pass-by-refere

2007-04-15 22:05:00 467

原创 Effective C++读书笔记之宁以pass-by-reference-to-const替换pass-by-value

 我们用pass-by-reference-to-const替换pass-by-value主要是有两个方面的考虑: 1) 效率问题 缺省情况下C++以by value方式传递对象。除非你另外指定,否则函数参数都是以实际实参的复件(副本)为初值,其返回值也是一个复件。这些复件由对象的copy构造函数产出。因此pass-by-value是一个费时操作。例如: class Person {}; clas

2007-04-15 13:11:00 528

原创 Effective C++读书笔记之设计class犹如设计type

       C++就像其它的OOP语言一样当你定义一个新class,也就定义了一个新的type。身为C++程序员,你的许多时间主要用来扩张你的类型系统(type system)。因此你应该带着和“语言设计者当初设计语言内置类型时”一样的谨慎来研讨class的设计     如何设计高效的classes呢?首先你必须了解你面对的问题。几乎每一个class都要求你面对以下的提问,而你的回答往往导致你的

2007-04-15 09:35:00 401

原创 Effective C++读书笔记之让接口容易被正确使用,不易被误用

这节不是针对某一个具体的问题展开的论述,而是对设计接口提出了一些原则。 1) 好的接口很容易正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质 2) “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容 3) “阻止误用”的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任 4) trl::shared_ptr支持定制删除(custom delet

2007-04-14 20:58:00 456

原创 Effective C++读书笔记之以独立语句将newed对象置入智能指针

假设有这样的函数: int priotity();    //返回优先级 void processWidget(std::trl::shared_ptr pw, int priority) 这个函数用来在某动态分配所得Widget上进行某些带有优先级的处理,由于我们记的“以对象管理资源”,所以processWidget决定对其动态分配得来的Widget运用智能指针。 调用这个函数 processW

2007-04-14 18:10:00 537

原创 Effective C++读书笔记之成对使用new和delete时要采用相同的形式

先看一段代码,看看有什么错: string* stringArray = new string[100]; .... delete stringArray; 好像是没有错,可是你会发现new 和delet的形式不一样。new声明了个数组,而delete只是删除了一个单一对象。其它的99个对象不大可能被删除,因为它们的析构函数没有被调用。       当我们使用new时(也就是通过new动态生成一个

2007-04-14 10:40:00 584

原创 Effective C++读书笔记之在资源管理类中提供对原始资源的访问

问题:       使用资源管理类是防止资源泄露的好方法,不过有的APIs需要直接访问资源,所以我们需要提供方法使我们可以访问资源管理类中的原始资源(raw resources)。举个例子: 在前面我们提过使用智能指针如auto_ptr或trl::shared_ptr保存factory函数如createInvestment的调用对象: std::trl::shared_ptr pInv(creat

2007-04-14 09:46:00 610

原创 Effective C++读书笔记之在资源管理类中小心coping行为

        上节我们介绍了一个观念:资源取得时机便是初始化时机(Resource Acquisition Is Initialization RAII),同时介绍了两个程序库提供的管现指针的资尖管理类auto_ptr和trl::shared_ptr。然而并不是所有的资源都是指针,所以有时我们要设计自己的资源管理类。 设计一个资源管理类: 假如我们用C APT处理类型为Mutex的互斥器对象,共

2007-04-13 10:43:00 773

原创 Effective C++读书笔记之以对象管理资源

 资源就是一旦使用了它,将来必须还给系统。C++中最常用的资源就是动态分配的内存。 举个例子来说明我们面对的问题       一个用来模拟投资行为的程序库,其中各式各样的投资类型继承自一个root class Investment class Investment {...};                //投资类型继承体系中的root class 它使用工厂模式供应我们某特定的Investm

2007-04-12 22:08:00 388

原创 Effective C++读书笔记之复制对象时勿忘其每一个成分

  当我们使用自己设计的copying函数(即copy构造函数和copy assignment操作符的总称)时,要非常小心的设计这些函数。因为当我们拒绝了编译器为我们自动生成时,编译器就放松对我们自己函数的安全检查,即当我们的代码必然要出错时也不会提醒我们。编译器太坏了 1) 复制class中所有的local成员变量   一个类设计完成后,包括copying函数,当你为这个类添加了一个成员变量,而

2007-04-12 11:12:00 386

原创 Effective C++读书笔记之在operator=中处理“自我赋值”

什么时候发生自我赋值 自我赋值发生在对象被赋值给自己时: class Widget {...}; Widget w; .... w = w;    //赋值给自己 一些潜在的自我赋值,不是一眼可以看出来的 1) *px = *py 如果px和py恰巧指向同一个东西,这也是自我赋值。一般如果某段代码操作pointers和references而它们被用来指向多个相同类型对象,这就需要考虑这些对象是否为

2007-04-12 09:57:00 522

原创 Effective C++读书笔记之令operator= 返回一个reference to *this

 关于赋值,有趣的是你可以把它们写成连锁形式: int x,y,z; x = y = z = 15;   //赋值连锁形式 赋值采用右结合律,所以上述连锁赋值被解析为: x = (y = (z = 15)); 这里15先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x。  为了实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符的左侧实参。这是

2007-04-11 17:09:00 384

原创 Effective C++读书笔记之绝不在构造和析构过程中调用virtual函数

 假设你有一个class继承体系,用来模拟股市交易的订单等。如下: class Transawction {             //所有交易的base class  public:   Transaction();      virtual void logTransaction() const = 0; //做出一份因类型不同而不同的日志记录  .... }; Transaction::T

2007-04-11 15:21:00 383

原创 Effective C++读书笔记之别让异常逃离析构函数

C++并不禁止析构函数吐出异常,但它不鼓励你这样做。 但是如果你的析构函数必须执行一个动作,而该动作可能会在失败时抛出异常,该怎么办?例如: class DBConn {  public:   ...   ~DBConn()   {    db.close()      //关闭数据库连接 有可能发出异常   }  private:   DBConnection db;        //一个负责

2007-04-10 16:41:00 394

原创 Effective C++读书笔记之为多态基类声明virtual析构函数

面临的问题是:使用多态时,是由一个基类的指针指向派生类对象,动态绑定的调用派生类的形为函数,当使用完毕时要delete这个对象时,销毁的是基类的那部分成员,而派生类中定义的成员变量没有被销毁。主要原因是这个派生类的析构函数没有被调用。这就会造成资源泄露。例如: class TimeKeeper {                 //声明了一个时钟的基类  public:   TimeKeeper

2007-04-10 14:42:00 476

brew开发教程(硬件+软件)

对于现在从事软件开发很多人来说,都是直接接触的Windows操作系统,一开始学习的东西就是在Windows下的图形编程,尤其是可以快速开发的诸如VB、Delphi和C++ Builder等语言。它们的程序开发方式就像是作画一样,通过将控件放到对应的窗体上,然后设置属性,完成事件处理过程就可以生成一个像模像样的Windows程序了。虽然使用这种语言可以很容易的开发出应用程序来,但是却缺乏了对系统的深入了解,只知道怎么做,却不知道为什么这么做以及它是怎么实现的。归根结底,就是缺乏对底层实现原理的知识。正如本章的标题“勿在浮沙筑高塔”一样,缺乏根基总还是底气不足!不过别担心,在这部分里,我将讲述我们所需要的一些“根基”。当然如果您已经对这些知识有所了解,并且只想看看BREW是个什么样子,那么可以跳过这一部分,而直接进入到第二部分。

2009-06-16

空空如也

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

TA关注的人

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