2011-03-06 9 views
2

「The C++ Programming Language」の書籍では、著者が次の例といくつかの主張を挙げています。ラージオブジェクトの演算子オーバーロードのための参照とポインタの使用

class Matrix { 
    double m[4][4]; 
    public: 
     Matrix(); 
     friend Matrix operator+(const Matrix&, const Matrix&) 
}; 

Matrix operator+(const Matrix& arg1, const Matrix& arg2) 
{ 
    Matrix sum; 
    for (int i=0; i<4; i++) 
    sum.m[i][j ]=arg1.m[i][j]+arg2.m[i][j]; 
    return sum; 
} 

本は

参照が過度にコピーすることなく、大きなオブジェクトのための通常の算術演算子を含む式の使用を許可することを主張しています。ポインタに適用される演算子の意味を再定義することはできないため、ポインタは使用できません。

上記の「過剰コピー」とは何ですか?そして、「ポインタは、ポインタに適用された演算子の意味を再定義することができないため使用できません」という文については、まったく失われています。説明ありがとう。

答えて

7

operator+ではなく、そのオペランドを取るように宣言された場合arg1との値によって、例えば、

Matrix operator+(Matrix arg1, Matrix arg2) 

をコピーを関数に渡す必要があります。単純マトリクス添加は、例えば、

Matrix x, y; 
x + y; 

がなされるxyの両方のコピーを必要とするであろう。効果的に、あなたは32 doubleをコピーしなければなりません。この場合、非常に高額ではありませんが、特に安いわけではありません。あなたが参照によって議論をするとき、コピーは作られなければなりません。

オペレータのオーバーロードの中には、参照によって引数を取らなければならないものがあることに注意してください。一般的な例として、<<ストリーム挿入演算子を考えてみましょう。ストリームをコピーすることができないため、参照としてオペランドstd::istreamを参照する必要があります。


オペレータがポインタにオーバーロードすることができないので、ポインタは使用できません。各オペレータ過負荷の少なくとも一方のオペランドは、クラスまたは列挙型でなければなりません。ポインタを使用することができたとしても、構文は非常に厄介です。上記のようにx + yを使用する代わりに、&x + &yを使用する必要があります。

1

「過剰コピー」部分はシンプルです。

参考文献は、いくつかの点でC++ポインタに似ており、ほとんどの場合、内部的にポインタを使用して実装されています。この本の注記では、クラスのインスタンスへの参照にoperator overloadingを使用することができます。

しかし、あなたは以下の(または任意の同等の構文)を行うことはできません。

Matrix operator+(const Matrix *arg1, const Matrix *arg2) 

だから、あなたが書き込むことはできません。

Matrix *a, *b, *c; 
c = a + b; 
0

ポインターやintなどの組み込み型のユーザー定義演算子を許可しない理由は、もちろんには、その言語で定義された演算子がになっていることです。

+0

実際には、言語には2つのポインタを追加する組み込み演算子がありません。プログラマが定義することもできません。 – anatolyg

+0

いいえ、2つのポインタを減算するような意味を持つ演算子しかありません。 –

関連する問題