2012-04-03 11 views
3

コンテナに渡されるオブジェクトをコンマと&に入れた理由をいくつかのボディに教えてください。私はここにあるコンストラクタでアンパサンドとコンボを使用して

Book::Book(const Date &date); 

混乱は、値が参照によって渡され、関数内でその変数にどんな変化が起こるが、その後反映しなければならないので、通常&記号は、いくつかの機能で使用されていることです。しかし一方で、constはその変数に代入を行うことができないと言っています。

体型がそれについての良いアイデアを持っている場合は、その理由を教えてください。

+3

値を渡すためにはコピーを作成する必要があり、コピーコンストラクタを呼び出す必要があるコピーコンストラクタを呼び出す必要があるためコピーコンストラクタに値渡しすることはできません。 –

答えて

6

これは不要なコピーを避けるためです。あなたはこのコンストラクタを呼び出すと、あなたのメンバ変数にコピーするとき、それは一度あなたがコンストラクタを呼び出す一度際、二回dateをコピーし、します

Book::Book(Date date): 
date_(date) 
{ 
} 

:、例えば、次のコードを取ります。

あなたがこれを行う場合:

Book::Book(const Date &date): 
date_(date) 
{ 
} 

dateを一度だけコピーされます。基本的に最適化に過ぎません。

4

最も一般的な選択肢は、値渡しすることです:const参照渡し

Book::Book(Date date); 

は、あなたが渡すパラメータがすでにDateときにコピーされるパラメータdateを防ぐことができます。オブジェクトのコピーは不要で、実行にコストがかかるか、スライスされたオブジェクト(および不正確な結果)が発生する可能性があります。

「スライシング」は、基本的にコピーを介してオブジェクトのタイプをそのベースに降格させることです。多態型では、パラメータがその基底(Date)としてコピーされ、実装が変更されたため多相インタフェースへの呼び出しが異なるため、実際にはその動作を変更できます(例:仮想メソッドは基底の実装を代わりに使用します) )。

+0

「コピーを保存する」という表現は、(「コピーを保持する」のように)ちょっと混乱するかもしれないと思います。私はあなたが「コピーを防ぐ」ことを意味することを理解する前に二重のテイクを取った。 – Eric

+0

@エリック感謝。更新された/明らかにされた文言。 – justin

+0

'Book :: Book(const Date date)'が 'Book :: Book(const Date&date)'よりも使用されるインスタンスはありますか?つまり、オブジェクトを直接(アンパサンドを省略して)渡すのですが、 'const'として優先されますか? –

0

const参照は、データをローカルコピーにコピーせずに、データをクラスに渡し、元のオブジェクトがその関数によって変更されないことを保証する方法です。

+0

純粋に最適化のためのアンパサンドが含まれていますか?例えば ​​'Book :: Book(const Date date)'はオブジェクトの参照を渡すだけでなく、元のオブジェクトの変更を防ぐが、 'Book :: Book(const Date date)'は実際の元のオブジェクトを渡すだけでなく、変更を防止する? –

+1

@akevitあなたの質問に関して[この質問と回答](http://stackoverflow.com/questions/8714250/isnt-const-redundant-when-passing-by-value)を参照してください。 – tmpearce

0

通常、入力パラメータのパフォーマンスの最適化です。 '&'を省略すると、パラメータは値で受け入れられ、入力オブジェクトは関数に渡される前にコピーされなければなりません。参照渡しはコピーをバイパスします。

2

これは、refrence(指定したとおり)でオブジェクトを渡すことを意味しますが、オブジェクト自体を関数(この場合はctor)から変更することはできません。

この理由は以下のようになります。あなたはaccidentially変更したくない

  • あなたのコードをより効率的にするために、完全なオブジェクトをコピーしたくない

    • 渡されたオブジェクト
    • あなたが指摘タイプ(この場合はDate)から派生するオブジェクトを渡すことができるようにしたい無名の一時
    • で機能を使用できるようにしたい
    第三の点については

    、考える:Cの++で

    Book b(Date()); 
    
  • 0

    を、あなたは、関数のパラメータの型を持っている場合const Type&ようになり、何をやっていることは、ユーザーが参照することによりにいくつかの値を渡すことができています - 値へのポインタが暗黙的に渡されますが、使いやすさのために、コンパイラは値として扱うことができます。

    コンパイラはポインタをまったく使用しないように最適化することもできます。また、関数は値のメモリを直接参照できます。

    constが使用される理由は、ユーザーが変更を期待していないメモリを変更することから保護し、ユーザーがconst変数を渡しても機能するようにすることです。

    関連する問題