『Effective C艹』読書ノート(13)
1438 ワード
条項20:pass-by-reference-to-constでpass-by-valueを置き換える
伝達参照は伝達値のパラメータよりも明らかな利点があるのは,伝達参照が新しいオブジェクトを構築することなく,構造関数と構造関数のオーバーヘッドを回避し,関数効率を向上させることである.
リファレンスパラメータを渡すときにconstリファレンスを使用すると、次に関数を使用する人に、このデータは関数では変更されないことを伝えることができます.
pass-by-valueはまたオブジェクトの切断の問題をもたらし、次のコード
上のコードの結果はI'm base classです.すなわち,伝達されたものがベースクラスであろうとサブクラスであろうと,伝達値によって生成されたオブジェクトはベースクラスオブジェクトと見なされる.サブクラスオブジェクトが拡張された部分は破棄されます.
オブジェクトカットの問題を解決する方法は、リファレンスの代わりにインデックスを使用することです.
比較的小さな組み込み型オブジェクト(int bool char)では、リファレンスの伝達よりも値の伝達が速くなる場合があります.原理的にはpass by referenceは実は伝達されたアドレスであるポインタであり、それらのタイプはポインタよりも大きくないからだ.またstl反復器では、リファレンスよりも値の伝達が高速です.
複雑なタイプでは、クラスが小さく見えても、転送リファレンスを使用することをお勧めします.誰もこのクラスが永遠に変わらないことを保証できないため、このクラスを拡張すれば、依然として膨大になる可能性があります.
伝達参照は伝達値のパラメータよりも明らかな利点があるのは,伝達参照が新しいオブジェクトを構築することなく,構造関数と構造関数のオーバーヘッドを回避し,関数効率を向上させることである.
リファレンスパラメータを渡すときに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反復器では、リファレンスよりも値の伝達が高速です.
複雑なタイプでは、クラスが小さく見えても、転送リファレンスを使用することをお勧めします.誰もこのクラスが永遠に変わらないことを保証できないため、このクラスを拡張すれば、依然として膨大になる可能性があります.