关于c ++:异常 – &的含义


Exceptions - meaning of '&' sign

本问题已经有最佳答案,请猛点这里访问。

我现在正进入C++的异常,我注意到我以前使用过的一个字符,但不是这样的。这是cplusplus.com使用的&;符号,如下所示:catch (exception& e)

当我把它和这样的指针一起使用时:pointer = &var给出指针var变量的位置。

如果字符的两种用法完全不同,那么它们有什么不同?


&有三种含义:

  • 按位与(二进制运算符)

    1
    0x010 & 0x100 == 0x110
  • (一元运算符)的地址

    1
    2
    int  x = 42;
    int* p = &x;
  • 引用(当类型的一部分时)

    1
    2
    int  x = 42;
    int& r = x;

你看的是后者。

这并不特定于异常;它只是意味着您正在捕获对作为异常抛出的对象的引用。这意味着您不需要复制异常对象,这会提高代码的安全性,特别是考虑到它当前正在处理一个意外(或"异常")场景。

是时候读你的C++书了!


它们是不同的。

1
pointer = &var;

pointer得到var的地址。

1
catch (exception& e)

他说,当e被传进来时,我们不会复制它,而是把它本身传进去。

我们通常在函数参数中使用:

1
2
3
4
5
void mySwap (int& a, int& b) ...

...

mySwap (x, y);

我们输入x表示a,输入y表示b,但我们不会像没有x和y时那样输入副本;我们自己输入x和y。(从技术上讲,我们通过"引用"来传递它,但这就是它的意义所在。)如果我们想改变x和y,这是很重要的,但这也是一种避免复制麻烦的简便方法。如果要跳过复制,但不使参数可更改,请使用const:

1
void myFunction (const Type& thingThatMustNotChanged);


在C++中,运算符"&"可以被重载。这意味着同一个操作符在不同的上下文中可以有不同的含义。C++中有许多可以重载的运算符。

"&;"运算符通常有三种含义:

在参考案例中:

1
2
int val1 = 2;
int &rval = val1;

在上述情况下

1
rval

是指

1
val1

这意味着

1
rval

实际上是使用

1
val1

注意:引用不是对象。这意味着引用不会占用内存中的任何空间,而普通引用只能绑定到非常量对象。但不是常量对象、文本或表达式的结果。

现在在指针的情况下:

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

在这种情况下,"val1"的地址存储在"ptr"中。但是指针是一个对象,这意味着当我们使用取消引用操作符"*"时,我们使用的是指向值。但是当我们不使用指针的时候。

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

*最后但不是最不重要的,用作位运算符:

位运算符用于二进制数字(即0和1)。当我们使用"&;"时,这意味着我们使用的是位"和"运算符。这是一个二元运算符,意味着它可以处理两个操作数。这里的"按位和"运算符测试两个位是否都包含二进制数字"1",如果是,则结果为1,否则为0。

*不要与包含两个"&;&;"的"逻辑与"运算符混淆。