2016-04-05 4 views
1

オペレータのオーバーロードを理解しようとしていますが、チュートリアルでは2つのオブジェクトを追加するためのオーバーロード "+"演算子の例があります。オペレータオーバーロードのパラメータとして "const"を使用します

Box operator+(const Box& b) 
    { 
    Box box; 
    box.length = this->length + b.length; 
    box.breadth = this->breadth + b.breadth; 
    box.height = this->height + b.height; 
    return box; 
    } 

なぜオブジェクトの定数参照が必要なのですか?

+1

"const"とは何ですか? – Fearnbuster

+1

_ @ Akka_ _ "const value" _実際にはconst参照ですが、用語に若干の違いがあります。 –

+0

@πάνταῥεῖ:それについて技術的にしたいのであれば、実際にはconstオブジェクトに対する非const参照です。 –

答えて

10

引数として渡されたBoxを変更する必要がないため、パラメータはconstです。
のいずれかを変更しないので、メソッド自体にはconstとマークする必要があります。

+0

その正しい予防策はパラメータを修正しないでください? このように一時オブジェクトを作成せずに "+"演算子をオーバーライドすることは可能ですか? '' this-> length = this-> length + b.length; '' そして '' return * this'' またはそれはいくつかの問題を引き起こしますか? –

+0

@AkkaJaworekバイナリ '+'演算子は、一般に2つのオペランドから新しい値を生成することは期待されていません。言語の中にはあなたがそれをやめることはありませんが、おそらくクラスのユーザーにとっては驚くべきことです。 – Quentin

+0

@AkkaJaworek _ "これで一時オブジェクトを作成せずに" + "演算子をオーバーライドすることは可能ですか?" _もちろん、 '* this'を参照として返してください。 –

0

Quentinの答えを基にして、 "読み取り専用"引数を渡す最も効率的な方法は、参照またはポインタ(これは基本的に同じものです)によって渡すことです。

しかし、これは関数内で引数が変更された場合(それは「読み込み専用」として使用する必要があるためですが、そうでなければならないため)、元の関数に渡された変数も変更されます。これを防ぐため、パラメータはconstとマークされています。

"読み取り専用"引数がでない場合は、が参照渡し、またはポインタで渡されてもそれほど問題にはなりませんが、前にも述べたように、これはもっと効率的です。

概要:「読み取り専用」paremetersに合格するための最良の方法は、const参照(&)です。

こちらがお役に立てば幸いです。

関連する問題