『Effective C艹』読書ノート(13)

1438 ワード

条項20:pass-by-reference-to-constでpass-by-valueを置き換える
    伝達参照は伝達値のパラメータよりも明らかな利点があるのは,伝達参照が新しいオブジェクトを構築することなく,構造関数と構造関数のオーバーヘッドを回避し,関数効率を向上させることである.
    リファレンスパラメータを渡すときにconstリファレンスを使用すると、次に関数を使用する人に、このデータは関数では変更されないことを伝えることができます.
 
    pass-by-valueはまたオブジェクトの切断の問題をもたらし、次のコード
#include<iostream>
#include<cstring>
#include<cstring>
using namespace std;
class base{
public:
    virtual void print()const{
        cout<<"I'm base class";
    }
};
class dev:public base{
public:
    void print()const{
        cout<<"I'm dev class";
    }
};

void fun(const base a){
    a.print();
}
int main(){
    dev d;
    fun(d);
    return 0;
}

     上のコードの結果はI'm base classです.すなわち,伝達されたものがベースクラスであろうとサブクラスであろうと,伝達値によって生成されたオブジェクトはベースクラスオブジェクトと見なされる.サブクラスオブジェクトが拡張された部分は破棄されます.
      オブジェクトカットの問題を解決する方法は、リファレンスの代わりにインデックスを使用することです.
void fun(const base& a){
    a.print();
}

 
    比較的小さな組み込み型オブジェクト(int bool char)では、リファレンスの伝達よりも値の伝達が速くなる場合があります.原理的にはpass by referenceは実は伝達されたアドレスであるポインタであり、それらのタイプはポインタよりも大きくないからだ.またstl反復器では、リファレンスよりも値の伝達が高速です.
    
    複雑なタイプでは、クラスが小さく見えても、転送リファレンスを使用することをお勧めします.誰もこのクラスが永遠に変わらないことを保証できないため、このクラスを拡張すれば、依然として膨大になる可能性があります.