摘要:
ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中。在VC下ActiveX控件的开发可以分为三种,一种是直接用COM的API来开发,这样做显然非常的麻烦,对程序员要求也非常高,因此一般是不予考虑的;一种是基于传统的MFC,采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。MFC为广大VC程序员所熟悉,易于上手学习,但缺点是MFC封装的东西比较多,因此用MFC开发出来的控件相对会比较大,因此比较适于开发桌面ActivexX控件,尤其是有GUI界面的控件。第三种就是基于ATL的,ATL可以说是专 阅读全文
摘要:
高质量,源码开放、平台独立、编译器独立的程序库。 http://boost.org,它和c++标准委员会之间有着独一无二的密切关系,并对委员会深具影响力。它以公开进行的同僚复审(public peer review)为基础接纳程序库。 boost对付的主题非常繁多,包括: 字符串与文本处理, 容器, 函数对象和高级编程, lambda,可以让我们轻松的随时随地创建函... 阅读全文
摘要:
c++Standard——定义c++语言及其标准程序库的规范,TR1详细叙述了14个新组件,都放在std命名空间内c++98列入的c++标准程序库有哪些主要成分:stl,覆盖容器、迭代器、算法、函数对象、各种容器适配器和函数对象适配器。Iostreams,覆盖用户自定缓冲功能,国际化I/o,以及预先定义的对象cin,cout,cerr和clog国际化支持,包括多区域能力。像wchar_t和wstring(由wchar_ts组成的strings)都对促进Unicode有所帮组。数值处理,包括复数模板(complex)和纯数值数组(valarray)。异常阶层体系(exception hierar 阅读全文
摘要:
class B{ public: virtual void f() const; }; class D: public B{ public: virtual void f(); }; 这里希望重新定义virtual函数B::f,但有个错误,B中的f是个const成员函数,但D中未被声明const。有编译器就这样说: warning:D... 阅读全文
摘要:
Widget* pw = new Widget; 共有两个函数被调用:一个分配内存的operator new,一个Widget的default构造函数。 假设第一个调用成功,第二个却抛出异常。步骤一所分配内存必须取消并恢复旧观,否则会造成内存泄漏。这时,客户没能力归还内存,因为Widget构造函数抛出异常,pw尚未被赋值,客户手上也就没有指针指向该被归还的内存。取消步骤一,并恢复旧观... 阅读全文
摘要:
实现一致性operator new必须返回正确的值,内存不足时必须调用new_handling函数,必须有对付零内存的准备,还需要避免不慎掩盖正常形式的new。 void* operator new(std::size_t size) throw(std::bad_alloc) { using namespace std; if (size ==... 阅读全文
摘要:
为什么有人想要替换operator new 和 operator delete呢?三个常见的理由: 1.用来检测运用上的错误。 如果将“new所的内存”delete却不幸失败,会导致内存泄漏。如果在“new所得内存”身上多次delete会导致不确定行为。如果new持有一串动态分配的所得地址,operator delete将地址从中移走,倒是很容易检测出上述错误用法。此外各式各样的编程错误... 阅读全文
摘要:
当operator new无法满足某一内存分配需求时,会抛出异常。再抛出异常以反映一个未获满足的内存需求之前,它会先调用客户指定的错误处理函数,new-handler。为了指定这个“用以处理内存不足”的函数,客户必须调用set-new-handler,那是声明于<new>的一个标准函数库函数: namespace std{ typedef void (*new_handle... 阅读全文
摘要:
template metaprogramming(模板元编程)是编写template-based c++程序并执行于编译期的过程。是以c++写成,执行于c++编译器内的程序。一旦tmp程序执行结束,其输出,也就是template具现出来的若干c++源码,便会一如往常的编译。 tmp有两个伟大的效力。第一,它让某些事情更容易。如果没有它,那些事情将是困难的,甚至是不可能的。第二,由于tmp执... 阅读全文
摘要:
stl主要由“用以表现容器、迭代器和算法”的template构成,但也覆盖若干工具性的templates,其中一个名为advance,将某个迭代器移动某个给定距离: template<typename IterT, typename DistT> void advance(IterT& iter, DistT d); //将迭代器向前移动d个单位,d<0则向后移动。 st... 阅读全文