条款20 宁以pass-by-reference-to-const替换pass-by-value 记住: ★尽量以pass-by-reference-to-const替换pass-by-value.前者通常高效,并可避免切割问题 ★以上规则并不适用于内置类型,以及STL的迭代器和函数对象.那些应用pass-by-value 条款21 必须返回对象时,别妄想返回其reference 记住: ★绝不要返回pointer或reference指向一个local stack对象(如函数里的局部对象):或返…
本条款的要点: 1.尽量以pass-by-reference-to-const替换pass-by-value.前者更高效且可以避免切割问题. 2.这条规则并不适用于内建类型及STL中的迭代器和函数对象类型.对于它们,pass-by-value通常更合适. 缺省的情况下,C++以by-value方式传递对象至函数,或者获取函数的对象返回值.除非你另外的指定,否则函数参数都是以实际实参的副本为初值,而调用端所获得的也是函数返回值的一个副本.这些副本都是有对象的copy构造函数得到的.这可能使得pas…
条款20 协助编译器实现返回值优化 当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数,这笔开销还是很大的.现在的新编译器已经可以对这种情况进行优化了,甚至优化到连开销都没有,只是有一定的适用范围.如果可以返回一个匿名的临时对象,并且利用构造函数来得到结果对象,那么就有可能被优化到零开销.注意,有名字的对象意味着返回值优化不可用. 假设有如下的代码: node a(); node b(…
注意一下,c++的底层编译器而言,引用类型往往都是由指针来实现出来的,所以pass-by-reference实际意义上往往是传递了一个指针,这对于c++的内置类型来说往往传递一个reference更加昂贵一点.但是这不能成为对所有的小对象不使用pass-by-reference的理由. 小结: 1. 尽量用pass-by-reference-to-const来代替pass-by-value,这样做不仅效率上更高,而且还可以避免切割问题 2. 这些规则不适用与内置类型.STL的迭代器还有函数对象,…
尽量以pass-by-reference-to-const替换pass-by-value.前者通常比较高校,并可避免切割问题(slicing problem). 以上规则并不适用于内置类型,以及STL的迭代器和函数对象.对它们而言,pass-by-value往往比较适当.…
继承标准STL的函数对象 1: struct PopLess : public atd::binary_function<state,state,bool> 2: { 3: bool operator() { const State &a, const State &b } const 4: { 5: return popless(a,b); 6: } 7: } 作者的解释: 首先popless是一个函数对象,他重载了函数调用操作符,因此可以用普通函数的调用语法.当然也可以实例…
缺省情况下,C++中函数参数的传递方式为by-value.即函数都是以实际参数的副本进行传递,而函数返回的也是一个副本.考虑如下实例程序: #include <iostream> class Person { public: Person(){ cout << "Person的构造函数" << endl; } virtual ~Person(){ cout << "Person的析构函数" << endl;…
pass-by-value void f(A a); 1)导致复制是浪费资源 2)多态是导致对象切割 所以我们使用 void f(const A& a) 上面的话针对class,不针对基本类型,函数对象(重载运算符),stl的迭代器. 基本类型:本来就很小,直接复制. 函数对象:暂时不清楚 stl迭代器:暂时不清楚…
切割(slicing)问题 请看下面代码: class Window { public: ... std::string name()const; //返回窗口名称 virtual void display()const; //显示窗口和其内容 }; class WindowWithScrollBars:public Window { public: ... virtual void display()const; }; 现在假设你希望写个函数打印窗口名称,然后显示该窗口,代码如下所示: voi…
    缺省情况下c++以by value的方式传递对象至(或来自)函数.除非你另外指定,否则函数参数都是以实际实参的复件(副本)为初值,而调用端所获得的亦是函数返回值的一个复件.这些复件是由对象的copy构造函数产出,这可能使得pass-by-value成为昂贵的操作.   #include "stdafx.h" #include <iostream> #include <string> class Window { public:     std::stri…