
c c++ & vc
文章平均质量分 68
anthit
这个作者很懒,什么都没留下…
展开
-
BAT编写详细手册 ( 转载 )
首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来转载 2008-12-21 15:03:00 · 6784 阅读 · 2 评论 -
Effective C++读书笔记之透彻了解inlining的里里外外
首先要明确一点,inline函数是c++提供的一个好的方法。可是我们要注意inline函数的概念是,将对函数的每个调用都以函数本体替换之。这样做可能增加你的目标码(object code)大小。在一个内存较小的机器上,这可能降低指令高速缓存的击中率。 记住,inline只是对编译器的一个申请,不是强制命令。它可以隐喻提出,也可以明确提出。隐喻方式是把函数定义在class定原创 2007-04-20 22:00:00 · 556 阅读 · 0 评论 -
Effective C++读书笔记之尽量延后变量定义式的出现时间
只要你定义了一个变量而其类型带有一个构造函数和析构函数,你就要承受构造和析构成本。有时这个变量最终并未被使用,这就是一种浪费了。你可能会说我不可能定义一个不使用的变量。哈哈 看看下面的代码例子,有时这种不使用不是由你故意造成的。 有一个计算通行密码的加密版本而后返回,前提是密码够长,否则函数会抛出一个异常。如下: //这个函数过早定义变量"encrypted" std::string原创 2007-04-19 10:05:00 · 497 阅读 · 0 评论 -
Effective C++读书笔记之若所有参数皆需类型转换,请为此采用non-member函数
举个例子来说明我们这次要面对的问题: 设计一个class用来表现有理数,它应该支持隐式类型转换,虽然我们说令classws支持隐式类型转换通常是个不好的主意。这是为了我们设计的类可以和内置类型进行运算。例如和整型。 class Rational { pbulic: Rational(int numerator = 0, int denominator = 1); //注意这个构造函数不为expl原创 2007-04-17 21:59:00 · 828 阅读 · 0 评论 -
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 · 930 阅读 · 0 评论 -
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 · 492 阅读 · 0 评论 -
Effective C++读书笔记之设计class犹如设计type
C++就像其它的OOP语言一样当你定义一个新class,也就定义了一个新的type。身为C++程序员,你的许多时间主要用来扩张你的类型系统(type system)。因此你应该带着和“语言设计者当初设计语言内置类型时”一样的谨慎来研讨class的设计 如何设计高效的classes呢?首先你必须了解你面对的问题。几乎每一个class都要求你面对以下的提问,而你的回答往往导致你的原创 2007-04-15 09:35:00 · 429 阅读 · 0 评论 -
Effective C++读书笔记之成对使用new和delete时要采用相同的形式
先看一段代码,看看有什么错: string* stringArray = new string[100]; .... delete stringArray; 好像是没有错,可是你会发现new 和delet的形式不一样。new声明了个数组,而delete只是删除了一个单一对象。其它的99个对象不大可能被删除,因为它们的析构函数没有被调用。 当我们使用new时(也就是通过new动态生成一个原创 2007-04-14 10:40:00 · 616 阅读 · 0 评论 -
Effective C++读书笔记之在资源管理类中提供对原始资源的访问
问题: 使用资源管理类是防止资源泄露的好方法,不过有的APIs需要直接访问资源,所以我们需要提供方法使我们可以访问资源管理类中的原始资源(raw resources)。举个例子: 在前面我们提过使用智能指针如auto_ptr或trl::shared_ptr保存factory函数如createInvestment的调用对象: std::trl::shared_ptr pInv(creat原创 2007-04-14 09:46:00 · 642 阅读 · 0 评论 -
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 · 557 阅读 · 0 评论 -
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 · 693 阅读 · 0 评论 -
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 · 633 阅读 · 0 评论 -
VC项目文件说明
VC项目文件说明 .dsp 项目参数配置文件,这个文件太重要,重点保护对象。. .dsw 工作区文件,重要性一般,因为它信息不我,容易恢复。 以下文件在项目中是可丢弃的,有些文件删除后,VC会自动生成的。 .clw ClassWizard信息文件,实际上是INI文件的格式,有兴趣可以研究一下.有时候ClassWizard出问题,手工修改CLW文件可以解决.如果此文件不存在的话,原创 2008-12-21 13:46:00 · 428 阅读 · 0 评论 -
关于Vc编译选项
许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more multiply defined symbols found这样的链接错误,而且通常是在使用第三方库时遇到的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,那么本文就试图为大家彻底解开关于它的种种疑惑。 大家都知道,从C/C++转载 2009-01-03 18:26:00 · 3431 阅读 · 3 评论 -
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 · 799 阅读 · 0 评论 -
CDC派生出的设备描述表
从CDC 派生出四个功能更具体的设备描述表类。层次如图所示。下面,分别讨论派生出的四种设备描述表。 CCientDC 代表窗口客户区的设备描述表。其构造函数CClientDC(CWnd *pWin)通过::GetDC获取指定窗口的客户区的设备描述表HDC,并且使用成员函数Attach把它和CClientDC对象捆绑在原创 2007-05-15 15:41:00 · 1253 阅读 · 0 评论 -
在MFC下创建一个窗口对象
MFC下创建一个窗口对象分两步,首先创建MFC窗口对象,然后创建对应的Windows窗口。在内存使用上,MFC窗口对象可以在栈或者堆(使用new创建)中创建。具体表述如下: 创建MFC窗口对象。通过定义一个CWnd或其派生类的实例变量或者动态创建一个MFC窗口的实例,前者在栈空间创建一个MFC窗口对象,后者在堆空间创建一个MFC窗口对象。原创 2007-05-15 14:20:00 · 1581 阅读 · 0 评论 -
用SDK编写各种Windows应用程序的规律
用SDK的Win32 API编写各种Windows应用程序,有其共同的规律:首先是编写WinMain函数,编写处理消息和事件的窗口过程WndProc,在WinMain里头注册窗口(Register Window),创建窗口,然后开始应用程序的消息循环。原创 2007-05-11 21:01:00 · 656 阅读 · 0 评论 -
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 · 1199 阅读 · 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 · 3779 阅读 · 0 评论 -
Effective C++读书笔记之为“异常安全”而努力是值得的
先来看一段代码,假设有一个class用来表现夹带背景图案的GUI菜单 class PrettyMenu { public: ..... void changeBackground(std::istream& imgSrc); //改变背景图案 private: Mutex mutex; //互斥器 用于多线程环境 Image* bgImage; //目前的背景图像原创 2007-04-20 14:21:00 · 639 阅读 · 0 评论 -
Effective C++读书笔记之让接口容易被正确使用,不易被误用
这节不是针对某一个具体的问题展开的论述,而是对设计接口提出了一些原则。 1) 好的接口很容易正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质 2) “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容 3) “阻止误用”的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任 4) trl::shared_ptr支持定制删除(custom delet原创 2007-04-14 20:58:00 · 480 阅读 · 0 评论 -
Effective C++读书笔记之以独立语句将newed对象置入智能指针
假设有这样的函数: int priotity(); //返回优先级 void processWidget(std::trl::shared_ptr pw, int priority) 这个函数用来在某动态分配所得Widget上进行某些带有优先级的处理,由于我们记的“以对象管理资源”,所以processWidget决定对其动态分配得来的Widget运用智能指针。 调用这个函数 processW原创 2007-04-14 18:10:00 · 570 阅读 · 0 评论 -
Effective C++读书笔记之了解C++默默编写并调用哪些函数
1,编译器会自动声明的类的成员函数 在一个类中,如果你没有声明copy构造函数,copy assignment操作符,和析构函数以及任何形式的构造函数。C++编译器会为这个类声明上述函数的编译器版本的。它们都是public且inline的。而且只有这些函数被调用时,它们才会被编译器创建出来,即给出它们的定义式例如: class Empty{}; //一个空类 上面的声明和下面的原创 2007-04-09 10:12:00 · 396 阅读 · 0 评论 -
Effective C++读书笔记之尽可能使用const
一,const修饰变量 关键字const可以修饰所有作用域中的变量,指定这个变量是不可改动的。 需要注意的是对指针的修饰。你可以修饰指针本身,可以修饰指针所指物,或两者都修饰。例:a b 是两个字符数组。 const char * p = &b; //指向常量数据的指针 char const * p = &b; //和上面的声明一样 char * const原创 2007-04-08 10:20:00 · 602 阅读 · 1 评论 -
Effective C++读书笔记之导读
1,C++的默认构造函数是指没有参数或所有的参数都有默认值的构造函数 2,如果一个构造函数声名时使用了关键字 explicit 说明这个构造函数不能被用来隐式类型转换 3,copy构造函数被用来以同型对象初始化自我对象 4,copy assignment操作符被用来从另一个同型对象中拷贝其值到自我对象 5,注意区分w1 = w2; 和 widget w1 = w2; 第一个语句原创 2007-04-06 14:30:00 · 448 阅读 · 0 评论 -
Effective C++读书笔记之确定对象被使用前已先被初始化
读取未初始化的值会导致不明确的行为,因此在使用对象前一定要初始化对象。 1,对于内置类型,要手工完成初始化工作 例如: int x = 10; //对int进行手工初始化 const char * text = "hello world"; //手工初始化 2,对于其它类型,使用构造函数,确保每一个构造函数都将对象的每个成员初始化 注意区分初始化和赋值,使用初始化列表和在原创 2007-04-08 20:51:00 · 518 阅读 · 0 评论 -
Effective C++读书笔记之尽量以const,enum,inline替换#define
当使用#define定义常量时,如#define ASPECT_RATIO 1.653。由于#define是预处理命令,所以ASPECT_RATIO有可能没进入记号表(symbol table)内。因此在有关这个常量出错时,错误提示中没有ASPECT_RATIO记号,于是你将因为追踪它浪费时。解决之道是用const来替换上述的宏(#define): const double Aspect原创 2007-04-07 10:41:00 · 1018 阅读 · 0 评论 -
Effective C++读书笔记之视C++为一个语言联邦
一开始C++只是C加上一些面向对象特性,因此它最初的名称是C with Classes 现在C++已经是个多重范型编程语言(multiparadigm programming language),一个同时支持过程形式(procedural)、面向对象形式 (object-oriented),函数形式(functional)、泛型形式(generic)、元编程形式(metaprogramming)原创 2007-04-06 15:40:00 · 461 阅读 · 0 评论 -
孙鑫VC++讲座笔记-(1)Windows程序内部运行机制
1,windows程序设计是种事件驱动方式的程序设计,主要基于消息的。当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。2,消息结构:typedef struct tagMSG { // msg HWND hwnd; //接收消息的窗口句柄。和哪个窗口相关联。 UINT转载 2007-01-03 14:05:00 · 768 阅读 · 0 评论 -
孙鑫VC++讲座笔记-(3)MFC程序框架的剖析
1.小知识在MFC中,以_t开头的标识符是已定义的宏,例如:#define _tWinMain WinMain#define _tMain main以Afx(application framwork)开头命名的函数是系统定义的框架函数,作用是为了把MFC中的类有机的结合在一起。例如:AfxWinMain()在MFC中所有类都是以C开头2.系统自动生成的类以Test工转载 2007-01-03 20:39:00 · 847 阅读 · 0 评论 -
孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
一,消息映射机制1,消息响应函数:(例:在CDrawView类响应鼠标左键按下消息) 1)在头文件(DrawView.h)中声明消息响应函数原型。//{{AFX_MSG(CDrawView) //注释宏afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//}}AFX_MSG //注释宏说明:在注释宏之间的声明在VC中灰色显示。转载 2007-01-04 17:12:00 · 807 阅读 · 0 评论 -
Effective C++读书笔记之若不想使用编译器自动生成的函数,就该明确拒绝
通常你不希望class支持某一特定机能,只要不声明对应函数就可以达到目的。可是这个策略对copy构造函数和copy assignment操作符却不起作用,因为如果你不为某个class声明这两个函数,即你不想这个class的对象有这两个功能(如下面的代码所示), class HomeForSale {...}; //一个类你不希望它的一个对象可以copy构造另一个对象或赋值原创 2007-04-09 22:31:00 · 487 阅读 · 0 评论 -
Effective C++读书笔记之为多态基类声明virtual析构函数
面临的问题是:使用多态时,是由一个基类的指针指向派生类对象,动态绑定的调用派生类的形为函数,当使用完毕时要delete这个对象时,销毁的是基类的那部分成员,而派生类中定义的成员变量没有被销毁。主要原因是这个派生类的析构函数没有被调用。这就会造成资源泄露。例如: class TimeKeeper { //声明了一个时钟的基类 public: TimeKeeper原创 2007-04-10 14:42:00 · 506 阅读 · 0 评论 -
Effective C++读书笔记之以对象管理资源
资源就是一旦使用了它,将来必须还给系统。C++中最常用的资源就是动态分配的内存。 举个例子来说明我们面对的问题 一个用来模拟投资行为的程序库,其中各式各样的投资类型继承自一个root class Investment class Investment {...}; //投资类型继承体系中的root class 它使用工厂模式供应我们某特定的Investm原创 2007-04-12 22:08:00 · 426 阅读 · 0 评论 -
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 · 1060 阅读 · 0 评论 -
Effective C++读书笔记之将成员变量声明为private
不使用public成员变量可以有很多的好处。 1) 语法一致性。当成员变量是private时,你只能通过函数访问它们。那么对类的成员的调用都需要带"()"了 2) 可以提供访问控制。如果成员变量为public时,每个人都可以访问它们。当为private时,你可以实现只读,只写等的访问。 3) 类的封装。如果你通过函数访问成员变量,可以为所有的可能的实现提供弹性。public意味着不封装。 注意:原创 2007-04-16 15:02:00 · 554 阅读 · 0 评论 -
Effective C++读书笔记之在资源管理类中小心coping行为
上节我们介绍了一个观念:资源取得时机便是初始化时机(Resource Acquisition Is Initialization RAII),同时介绍了两个程序库提供的管现指针的资尖管理类auto_ptr和trl::shared_ptr。然而并不是所有的资源都是指针,所以有时我们要设计自己的资源管理类。 设计一个资源管理类: 假如我们用C APT处理类型为Mutex的互斥器对象,共原创 2007-04-13 10:43:00 · 806 阅读 · 0 评论 -
Effective C++读书笔记之复制对象时勿忘其每一个成分
当我们使用自己设计的copying函数(即copy构造函数和copy assignment操作符的总称)时,要非常小心的设计这些函数。因为当我们拒绝了编译器为我们自动生成时,编译器就放松对我们自己函数的安全检查,即当我们的代码必然要出错时也不会提醒我们。编译器太坏了 1) 复制class中所有的local成员变量 一个类设计完成后,包括copying函数,当你为这个类添加了一个成员变量,而原创 2007-04-12 11:12:00 · 414 阅读 · 0 评论 -
Effective C++读书笔记之在operator=中处理“自我赋值”
什么时候发生自我赋值 自我赋值发生在对象被赋值给自己时: class Widget {...}; Widget w; .... w = w; //赋值给自己 一些潜在的自我赋值,不是一眼可以看出来的 1) *px = *py 如果px和py恰巧指向同一个东西,这也是自我赋值。一般如果某段代码操作pointers和references而它们被用来指向多个相同类型对象,这就需要考虑这些对象是否为原创 2007-04-12 09:57:00 · 553 阅读 · 0 评论