Effective C++--经验条款】的更多相关文章

高效C++ --模板与泛型编程 在C++中模板体现的是编译期多态,virtual体现的是执行期多态. 关于typename的双重含义: 在声明template參数时,不论使用keywordclass或typename,意义全然同样. 可是C++并不总是把class和typename视为等价. 有时候必须使用typename. Template内出血的名称假设依于某个template參数,称之为从属名称.假设从属名称在class内呈嵌套状,我们称她为嵌套从属名称. 总而言之,在一个模板中使用了还有…
---恢复内容开始--- C++编译器能够在两种数据类型之间进行隐式转换(implicit conversions),它继承了C语言的转换方法,例如允许把char隐式转换为int和从short隐式转换为double.因此当你把一个short值传递给准备接受double参数值的函数时,依然可以成功运行.C中许多这种可怕的转换可能会导致数据的丢失,它们在C++中依然存在,包括int到short的转换和double到char的转换. 你对这些类型转换是无能为力的,因为它们是语言本身的特性.不过当你增加…
条款20 协助编译器实现返回值优化 当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数,这笔开销还是很大的.现在的新编译器已经可以对这种情况进行优化了,甚至优化到连开销都没有,只是有一定的适用范围.如果可以返回一个匿名的临时对象,并且利用构造函数来得到结果对象,那么就有可能被优化到零开销.注意,有名字的对象意味着返回值优化不可用. 假设有如下的代码: node a(); node b(…
每个人都有思想.有些人相信自由经济学,有些人相信来生.有些人甚至相信COBOL是一种真正的程序设计语言.C++也有一种思想:它认为潜在的二义性不是一种错误.ambiguity 这是潜在二义性的一个例子: class B; // 对类B提前声明 // class A {public: A(const B&); // 可以从B构造而来的类A}; class B {public: operator A() const; // 可以从A转换而来的类B}; 这些类的声明没一点错——他们可以在相同的程序中共…
有时,一个类想跟踪它有多少个对象存在.一个简单的方法是创建一个静态类成员来统计对象的个数.这个成员被初始化为0,在构造函数里加1,析构函数里减1.(条款m26里说明了如何把这种方法封装起来以便很容易地添加到任何类中,“my article on counting objects”提供了对这个技术的另外一些改进) 设想在一个军事应用程序里,有一个表示敌人目标的类: class enemytarget {public: enemytarget() { ++numtargets; } enemytar…
因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定的,而缺省參数却是静态绑定. 对象的所谓静态类型,是它在程序中被声明时所採用的类型. 你可能会在"调用一个定义于derived class 内的virtual函数"的同一时候,却使用了base class为它所指定的缺省參数值. (二) 为什么继承而来的virtual函数的缺省參数值不能被…
(一) 有时候为了让一个对象尽量小,能够把数据放在另外一个辅助的struct中,然后再让一个类去指向它.看以下的代码: class Point { public: Point(int x, int y); void setX(int newVal); void setY(int newVal); }; struct RectData { Point ulhc; Point lrhc; }; class Rectangle { public: Point& upperLeft() const {…
(一) 缺省情况下swap动作可由标准程序库提供的swap算法完毕: namespace std { template<typename T> void swap(T& a, T& b) { T temp(a); a = b; b = temp; } } 这个函数是异常安全性编程的核心,而且是用来处理自我赋值可能性的一个常见机制 可是对某些类型而言,这些复制动作无一必要:当中基本的就是"以指针指向一个对象,内含真正数据"那种类型.多为"pimpl手…
(一) 在一项条款说法auto_ptr和tr1::share_ptr适合heap-based资源.然而,并非所有的资源都heap-based的.换句话说不tr1::shared_ptr 和 auto_ptr 总是适合作为资源管理器.管理类型. 如果Mutex类型通过lock和unlock两组函数进行相互排斥器的锁定和解锁,可能我们希望和auto_ptr一样的行为.在某个智能类型析构时主动调用unlock进行解锁. 比方以下的代码: void lock(Mutex* pm); void unloc…
一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题. 条款2:最好使用 C++ 类型转换运算符(Prefer C++-style casts) C++的类型转换运算符安全,容易解析,分工精细,虽然要打多点字. 条款3:绝对不要以 polymorphically(多态)方式來处理数组(Never treat arrays polymorphicall…