2011-03-06 88 views
2

在「C++編程語言」一書中,作者給出了以下示例和幾個聲明。使用引用和指針爲運算符重載大對象

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+代替聲明爲接受其操作數按價值,例如,

Matrix operator+(Matrix arg1, Matrix arg2) 

然後副本arg1和必須將傳遞給函數。一個簡單的矩陣此外,例如,

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

不允許用戶定義的操作符用於內置類型(如指針或整數)的原因當然是它們已經有運算符爲該語言定義了它們。

+0

實際上,該語言沒有用於添加2個指針的內置操作符。它也不允許程序員定義它。 – anatolyg

+0

不,它只有一些有意義的運算符,比如減去兩個指針。 –