2016-07-15 93 views
-1

自從我上一次編程類(回到春季)以來,已經過去了幾個月,我試圖在重載一個類的操作符之前做一些練習回去上課。我從來不明白的一件事是在函數名稱中放置&運算符。例如:瞭解重載插入/提取操作符的語法(&操作符放置)

ostream & operator << (ostream & Out, const Measurement & X) 

第一&的位置似乎有些奇怪,因爲我們通常將參考運營商,我們希望成爲一個參考對象的前面,但第一個被放置operator <<之前。這裏是operator <<的對象嗎?

我很抱歉,我們的教授從來沒有解釋過這個語法,只是教會我們不要質疑它,我不喜歡。我想完全理解語法。

編輯:我已經包含了下面的全部功能。

ostream & operator << (ostream & Out, const Measurement & X) 
{ 
    Out << "Inches : " << X.Inches; 
    Out << "\nFeet : " << X.Feet; 
    Out << "\nMiles : " << X.Miles; 
    Out << "\n"; 

    return Out; 
} 
+1

*第一&似乎有些奇怪,因爲我們通常將參考操作對象中的*前的位置 - 鑑於描述中, '&'不是引用操作符,它是'操作符地址' - 完全不同的含義,儘管使用了相同的符號。 – PaulMcKenzie

回答

1

你感到困惑,因爲符號&意味着在不同的語境不同:

int i, j; 
int* ptr = &i; // & is used with a variable, and it is operator "address-of" 
int r = i & j; // & is used with 2 variables and it is operator "bitwise-and" 
int& ref = i; // & is used with a type, not variable and it is not an operator anymore, 
       // it is type modifier, which says type is now not `int` 
       // but reference to `int` 
在此代碼

所以:

ostream& operator << (ostream& Out, const Measurement& X); 

&使用類型ostreamMeasurement,並修改該類型的引用

+0

這是一個非常有啓發性的迴應。我一直認爲,&運算符與實際變量名稱分組在一起,然後將其修改爲引用,但是您說的&實際上是修改了類型本身,這幾乎反映在您的編碼風格中,因爲你把&放在int旁邊,而不是放在變量名本身旁邊(即使編譯器沒有看到它) - EX int&ref vs int&ref。這種風格直觀地顯示它影響類型本身。這是有道理的,因爲我們正在返回一個ostream引用,在我的情況。正確? –

+0

通過語言規則&(並且在這種情況下它不是運算符)實際上是與變量一起分組的,即'int & a, b;' - 'a'是引用,但是'b'不是,無論您在哪裏放置空格。但是我特意將它們分組爲這個例子中的類型,以便使其更加清晰。就我個人而言,我將它們按照語言規則進行變量分組,但我知道開發人員更喜歡用類型進行分組。 – Slava

+0

謝謝。在這種情況下,我需要打破我稱之爲操作員的習慣。它只是一個運算符,如果它在獲取指針的地址時使用了按位。感謝您爲我重申這一點。這些都是我的教授從未討論過的。他只是告訴我們在哪裏放置語法來編譯它,但沒有解釋不同情況下使用&的區別。它有點令人沮喪,意識到它從來沒有被正確解釋。 –

0

是運營商< <這裏對象?

不,您可能會混淆語法中的某些內容。 &實際上屬於std::ostream類型,並指示從該函數返回引用。

返回類型中的引用實際上表示將傳遞第1個參數引用,以允許將調用鏈接到該運算符重載。實施應該是這樣的:

ostream & operator << (ostream & Out, const Measurement & X) { 
    Out << X.x << " " << X.y; 
    return Out; // <<<<<<<<< This is essential! 
} 

因此你可以調用鏈接操作,如

Measurment a; 
// Do whatever with a 
std::cout << a << std::endl; 
+0

我編輯了我的原稿,使其具有整個功能,我在那裏使用了返回語句。那麼我們是否簡單地返回Out的地址? –

+0

在這些重載函數中,我們都將結果打印到屏幕並返回對象? –

+0

您正在返回與傳入的參考相同的參考。正如我所提到的,這樣做是爲了允許鏈接操作員調用。 –