随笔分类 - c/c++
摘要:高质量,源码开放、平台独立、编译器独立的程序库。 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...
阅读全文
摘要:所谓智能指针是“行为像指针”的对象,并提供指针没有的机能。 真实指针做的很好的一件事是,支持隐式转换。Derived class指针可以隐式转换为base class指针。指向non-const的对象的指针可以转换为指向const对象。下面是发生于三层继承体系的一些转换: class Top{...}; class Middle: public Top{...}; ...
阅读全文
摘要:template是节省时间和避免重复代码的一个奇妙方法。class template的成员函数只有在被使用时才被暗中具现化。function templates有类似的诉求。 但是如果你不小心,使用templates可能导致代码膨胀(code bloat):其二进制代码带着重复(或几乎重复)的代码、数据、或两者。其结果可能源码看起来合身整齐,但目标码却不是那么回事。你需要知道如何避免这样的...
阅读全文
摘要:我们需要一个程序,传送信息到不同的公司去。信息要不译成密码,要不就是未加工的文字。如果编译期间我们有足够信息来决定哪一个信息传至那一家公司,就可以采用基于template的解法: class CompanyA{ public: void sendCleartext(const std::string& msg); void sendEncrypt...
阅读全文
摘要:template声明式中,class和typename这两个关键字意义完全相同 template<class T> class Widget; template<typename T> class Widget; 有时候你一定要用typename, 可以在template中指涉的两种名称: template <typename C> void print2n...
阅读全文
摘要:面向对象编程世界总是以显示接口(explicit interface)和运行期多态(runtime polymorphism)解决问题。 class Widget{ public: Widget(); virtual ~Widget(); virtual std::size_t size() const; vi...
阅读全文
摘要:一旦涉及多重继承(multiple inheritance;MI): 程序有可能从一个以上的base class继承相同名称(如函数、typedef等)。那会导致较多的歧义机会。例如: class BorrowableItem { public: void checkOut(); }; class ElectronicGadet { p...
阅读全文
摘要:c++中public继承视为is-a关系。现在看private继承: class Person{...}; class Student: private Person {...}; void eat(const Person& p); void study(const Student& s); Person p; Student s; e...
阅读全文
摘要:复合(composition)是类型之间的一种关系,当某种类型的对象内含它种类型的对象,便是这种关系: class Address {...}; class PhoneNumber {...}; class Person { public: ... private: std::string name;//合成成分物 ...
阅读全文
摘要:重新定义一个继承而来的non-virtual函数永远都是错误的,本条款的讨论限制在“带有缺省参数的virtual函数”。 virtual函数是动态绑定的,而缺省参数却是静态绑定。 对象的所谓静态类型,是它在程序中被声明时所采用的类型。 class Shape { public: enum ShapeColor {Red, Green, Blue}; ...
阅读全文
摘要:class B { public: void mf(); ... }; class D : public B {...}; D x; 如果一下行为: B* pB = &x; pB->mf(); 异于以下行为: D* pD = &x; pD->mf(); 你可能相当惊讶。两者的行为确实应该相同,但是如果mf...
阅读全文
摘要:假设你整在写一个视频游戏软件,由于不同的人物可能以不同的方式计算它们的健康指数,将healthValue声明为virtual似乎再明白不过的做法:class GameCharacter { public: virtual int healthValue()const; ... };由于这个设计如此明显,你可能没有认真考虑其他替代方案。为了帮助你跳脱面向对象设计路上的常轨,让我们考虑其他一些解法:藉由Non-virtual interface手法实现Template Method模式有个思想流派主张virtual函数应该几乎总是private。他们建议,较好的设计是保留healthValue..
阅读全文

浙公网安备 33010602011771号