摘要:
条款24说过为什么惟有non-member函数才有能力“在所有实参身上实施隐式类型转换”。本条款将Rational和operator*模板化: template<typename T> class Rational{ Rational(const T& number = 0, const T& denominator = 1); ... 阅读全文
摘要:
所谓智能指针是“行为像指针”的对象,并提供指针没有的机能。 真实指针做的很好的一件事是,支持隐式转换。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}; ... 阅读全文