2015-02-06 163 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。

*不要与含有“逻辑和”运营商混淆两个'& &'。