2015-02-06 63 views
-5

我現在正在C++中遇到異常,並且我注意到之前使用過的一個字符,但不是這樣。這是&標誌,使用cplusplus.com爲: catch (exception& e)異常 - '&'號的含義

雖然我以前這樣的指針使用它: pointer = &var這給了指針的變量var的位置。

中有什麼&角色的兩種用途不同,如果它們是不同的呢?

+2

http://en.cppreference.com/w/cpp/language/reference#Lvalue_references – chris 2015-02-06 15:11:10

+2

您在使用哪本書教導引用前的異常? – 2015-02-06 15:14:53

回答

7

還有的&三層含義:

  • 位與(二元運算符)

    0x010 & 0x100 == 0x110 
    
  • 取地址(單目運算符)

    int x = 42; 
    int* p = &x; 
    
  • 參考(當部分類型)

    int x = 42; 
    int& r = x; 
    

您正在看後者。

這不是特定於例外;這僅表示您正在捕獲參考到作爲例外引發的對象。這意味着您不需要複製異常對象,這會提高代碼的安全性,特別是當前正在處理意外(或「異常」)情況。

時間閱讀that C++ book of yours…!

1

他們不一樣。

pointer = &var; 

pointer得到的var地址。

catch (exception& e) 

說,當e傳遞中,我們不會讓一個副本,但是傳遞的事情自己。

我們使用這種常用的功能參數:

void mySwap (int& a, int& b) ... 

... 

mySwap (x, y); 

我們通過在X的和y B,但我們確實在副本,我們會如果沒有&不及格;我們自己傳遞x和y。 (從技術上講,我們通過「引用」來傳遞它,但這就是它的意思。)如果我們想要更改x和y,這是非常重要的,但這也是一個不費吹灰之力的方法。如果你想跳過製作副本,但不能進行參數多變,使用常量:

void myFunction (const Type& thingThatMustNotChanged); 
+0

海事組織最好把參考作爲一個像普通物體一樣使用的指針來考慮。就像指針一樣,你可以引用一個不再存在的對象。根據使用情況,多次引用將編譯成指針。 – David 2015-02-06 15:17:07

+1

@Dave:_「就像指針一樣,你可以參考一個不再存在的對象。」_不,我的意思是,當你搞砸時,你可以身體上得到這種情況,但只有在你已經違反了C++語言的先決條件,因此您不再編寫它。所以,在C++中,這是不可能的。 – 2015-02-06 15:20:50

+0

@LightnessRacesinOrbit C++語言的先決條件?你必須詳細說明。使用指針幾乎與使用指針一樣容易 - 它打破的唯一先決條件就是您在自己的程序中構成的任何內容。 'auto a = make_unique (); A&b = * a; a.reset();' - 那裏沒有任何細節。 – David 2015-02-06 15:28:42

0

在C++中,運營商&「可以被重載。這意味着同一個操作員在不同的環境下可以有不同的含義。 C++中有很多運算符可以重載。

在 '&' 操作者通常具有3名的含義:

在參考的情況下:

int val1 = 2; 
int &rval = val1; 

在上述情況下

rval 

被製成

val1 
基準

這意味着任何使用

rval 

實際上是利用

val1 

注:引用是不是一個對象。這意味着一個引用不會佔用內存中的任何空間,並且一個純引用只能綁定到一個非const對象。但不適用於const對象,文字或表達式的結果。

現在,在指針的情況下:

int val1 = 2; 
int *ptr = &val1; 

在這種情況下 'VAL1' 的地址被存儲在 'PTR'。但是指針是一個對象,這意味着當我們使用解引用運算符'*'時,我們使用指向的值。但是當我們不使用指針時。

*ptr = 55 // pointed to value is changed 
ptr = p; // the pointer's own memory 

*最後但並非最不重要的,用作位運算符:

位運算符的工作原理與二進制數字(即,0和1)。當我們使用'&'時,這意味着我們正在使用按位'和'運算符。這是一個二元運算符,這意味着它可以與兩個操作數一起工作。這裏「按位與」運算符測試是否兩個位包含二進制數字「1」,如果是的話,那麼結果是1,否則爲0。

*不要與含有「邏輯和」運營商混淆兩個'& &'。