たとえば、コンストラクターで渡されるオブジェクトに const と & を通常配置する理由を誰かが教えてくれますか。
Book::Book(const Date &date);
私がここで持っている混乱は、値が参照によって渡され、関数内のその変数に発生した変更が後で反映されるため、通常 & 記号が some 関数で使用されることです。しかし一方で const は、その変数に代入を行うことはできないと言います。
誰かがそれについて良い考えを持っているなら、その理由を教えてください.
たとえば、コンストラクターで渡されるオブジェクトに const と & を通常配置する理由を誰かが教えてくれますか。
Book::Book(const Date &date);
私がここで持っている混乱は、値が参照によって渡され、関数内のその変数に発生した変更が後で反映されるため、通常 & 記号が some 関数で使用されることです。しかし一方で const は、その変数に代入を行うことはできないと言います。
誰かがそれについて良い考えを持っているなら、その理由を教えてください.
これは、不要なコピーを避けるために行われます。たとえば、次のコードを見てください。
Book::Book(Date date):
date_(date)
{
}
このコンストラクターdate
を呼び出すと、コンストラクターを呼び出すときに 1 回、メンバー変数にコピーするときに 1 回、2 回コピーされます。
これを行う場合:
Book::Book(const Date &date):
date_(date)
{
}
date
一度だけコピーされます。それは本質的に単なる最適化です。
最も一般的な代替手段は、値渡しです。
Book::Book(Date date);
const 参照date
で渡すと、渡すパラメーターが既に である場合にパラメーターがコピーされなくなりますDate
。オブジェクトのコピーは不必要であったり、実行にコストがかかったり、スライスされたオブジェクト (および誤った結果) になる可能性があります。
「スライス」とは、基本的に、オブジェクトの型をそのベースにコピーすることによって降格することです。ポリモーフィック型の場合、これは実際にその動作を変更する可能性があります。これは、パラメーターがそのベース ( Date
) としてコピーされ、実装が変更されたため、そのポリモーフィック インターフェイスへの呼び出しが異なるためです (たとえば、その仮想メソッドは代わりにベースの実装を使用します)。 .
これは、(前述のように)refrenceを介してオブジェクトを渡すことを意味しますが、オブジェクト自体を関数(この場合はctor)から変更することはできません。
この理由は次のとおりです。
Date
指定されたタイプ(この場合)から派生したオブジェクトを渡すことができるようにする必要があります3番目のポイントについては、次のことを考慮してください。
Book b(Date());
C ++では、関数のパラメータータイプがのようなものconst Type&
である場合、ユーザーが参照によって値を渡すことができるようにします-値へのポインターは暗黙的に渡されますが、使いやすさのために、コンパイラーは値であるかのように扱うことができます。
場合によっては、コンパイラーがポインターをまったく使用しないように最適化することもでき、関数は値のメモリーを直接参照できます。
使用される理由const
は、ユーザーが変更することを期待していないメモリを変更しないように保護し、ユーザーがconst変数を渡した場合でもメモリを機能させるためです。
これは通常、入力パラメーターのパフォーマンスの最適化です。「&」を省略すると、パラメーターは値として受け入れられ、関数に渡す前に入力オブジェクトをコピーする必要があります。参照渡しはコピーをバイパスします。
const 参照は、データをローカル コピーにコピーせずにデータをクラスに渡す方法であり、元のオブジェクトが関数によって変更されないことを保証します。