热文Effective C++ 读书笔记 Item48 了解模板元编程
模板元编程(Template Metaprogramming,TMP)就是利用模板来编写那些在编译时运行的C++程序。 模板元程序(Template Metaprogra...
模板元编程(Template Metaprogramming,TMP)就是利用模板来编写那些在编译时运行的C++程序。 模板元程序(Template Metaprogra...
模板是个好东西,你可以在实现类型安全的同时少写很多代码。但模板提供的是编译期的多态, 即使你的代码看起来非常简洁短小,生成的二进制文件也可能包含大量的冗余代码。 因为模板...
从面向对象C++转移到模板C++时,你会发现类继承在某些场合不在好使了。 比如父类模板中的名称对子类模板不是直接可见的,需要通过this->前缀、using或显式地特化模...
时至今日还有人在论坛里问模板参数前的typename和class有何区别: template<typename T> class Widget; template<cl...
面向对象设计中的类(class)考虑的是显式接口(explicit interface)和运行时多态, 而模板编程中的模板(template)考虑的是隐式接口(impli...
使用多继承时, 一个问题是不同基类可能具有相同名称,产生歧义(即使一个名字可访问,另一个不可访问) 多继承(Multiple Inheritance,MI)是C++特有的...
I][]tem 32提出public继承表示"is-a"的关系,这是因为编译器会在需要的时候将子类对象隐式转换为父类对象。 然而private继承则不然: cl...
一个类型包含另一个类型的对象时,我们这两个类型之间是组合关系。组合是比继承更加灵活的软件复用方法。 Item 32提到public继承的语义是”is-a”的关系。对象组合...
不要重写父类函数的默认参数。Item 36已经说明子类中不应该重写继承而来的父类的非虚函数。 那么本文讨论的内容其实是:不要重定义虚函数的默认参数。为什么呢? 因为虽然虚...
从规范上说, 条款 34 提到,如果某个操作在整个继承体系应该是不变的,那么使用 non-virtual 函数,此时派生类从基类继承接口以及一份强制实现。如果派生类希望表...
比如你在开发一个游戏,每个角色都有一个healthValue()方法。很显然你应该把它声明为虚函数,可以提供默认的实现,让子类去自定义它。 这个设计方式太显然了你都不会考...
不同于Objective C或者Java,C++中的继承接口和实现继承是同一个语法过程。 当你public继承一个类时,接口是一定会被继承的(见Item32),你可以选择...
其实本文的话题和继承完全没有关系,隐藏名称是作用域的问题。 在C++中每一对{ }都会开启一个新的作用域,并嵌套在当前作用域中。 一个示例 int x; void fun...
C++面向对象程序设计中,最重要的规则便是:public继承应当是”is-a”的关系。当Derived public继承自Base时, 相当于你告诉编译器和所有看到你代码...
假设某一天你打开自己的C++程序代码,然后对某个类的实现做了小小的改动。提醒你,改动的不是接口,而是类的实现,也就是说,只是细节部分。然后你准备重新生成程序,心想,编译和...
inline(内联)函数的好处太多了:它没有宏的那些缺点,见Item 2:避免使用define;而且不需要付出函数调用的代价。 同时也方便了编译器基于上下文的优化。但in...
1)异常安全的 2 个条件 异常安全有 2 个条件: 不泄露任何资源:即发生异常时,异常发生之前获得的资源都应该释放,不会因为异常而泄露。在 上面的例子中,如果 new...
不要返回对象私有成员的句柄。这里的“句柄”(handle)包括引用、指针和迭代器。 这样可以增加类的封装性、使得const函数更加const, 也避免了空引用的创建(da...
C++的类型检查只在编译时执行,运行时没有类型错误的概念。 理论上讲只要你的代码可以编译那么就运行时就不会有不安全的操作发生。 但C++允许类型转换,也正是类型转换破坏了...
这一规则在任何编程语言中都适用,一方面可以避免无用的构造使得程序更高效,另一方面作用域的缩小会使程序更加清晰。 存在控制流转移的代码中,你可能会不经意间定义无用的变量。例...
我们可以调用std下的swap函数,这是一个模板函数:既可以: int a = 1; int b = 2; std::swap(a,b); cou...
C++中的 Traits 类可以在编译期提供类型信息,它是用Traits模板及其特化来实现的。 通过方法的重载,可以在编译期对类型进行”if…else”判断。我们通过ST...
Item 24中提到,如果所有参数都需要隐式类型转换,该函数应当声明为非成员函数。Item 24是以Rational和operator*为例子展开的,本文把这个观点推广到...
I][]tem 13提到智能指针可用来自动释放堆中的内存,STL中的迭代器也是一种智能指针,它甚至支持链表元素指针的`++`操作。 这些高级特性是普通指针所没有的。本文以...