我是一个生疏的业余C++程序员,经过一段时间后回来,从OpenGL 2.0转向Vulkan。
我试图理解我正在阅读的教程背后的代码,而不仅仅是复制,但不理解以下内容的部分内容:
catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
为什么&之后是例外?我的理解是指针通常在变量之后,地址在它之前,例如:
int* pintVar;
pintVar = &intVar;
这与将常量引用">异常"绑定到临时对象">e"有关吗?
如您所见,我正在尝试研究/谷歌它,但并不完全理解它或为什么。
任何帮助将不胜感激。
&
根据上下文有不同的含义。在声明中,它表示reference to
.例如
int a = 42;
int &b = a; // b is a reference to a
// b is essentially an alias of a (they both have the same address, for example)
// i.e. changes to b will be reflected in a, and vice versa
这里有一些参考资料可以更深入地解释这一点。
当&
用于已经存在的变量时,这意味着address-of
.
int a = 42;
int *b = &a; // b points to a (i.e. b holds the address of a).
因此,在您的示例中,e
是对传入的任何异常的常量引用(因为函数的参数声明了一个变量(。
类似的问题:
int* pintVar;
"为什么 * 在 int 之后?间接寻址运算符在那里做什么?为什么它不在变量名称之前,例如此处?
int intVar = *pintVar;
好吧,你看*符号有多种含义。也许您已经了解这一点:在复合类型名称中,它表示指针类型。在表达式中,它表示运算符。它可以是一元间接寻址运算符(*pintVar
(或二进制乘法运算符(a * b
(。
以完全相同的方式,&符号具有多种含义。在复合类型名称中,它表示引用类型。在表达式中,它表示运算符。它可以是一元地址运算符(&intVar
(或二进制按位AND运算符(a & b
(。
因此,const T&
是对常量 T 的引用,就像const T*
是指向常量 T 的指针一样。
引用和指针都是间接形式,并且非常微笑。它们的区别是:
- 指针是对象,引用不是对象
- 因为引用不是对象,所以没有办法获取引用的地址,也没有指向引用的指针或对引用的引用之类的东西。
- 也没有引用数组。
- 可以分配一个(非常量(指针来指向另一个对象。引用在其整个生存期内绑定到单个对象。
- 指针可以为空,引用不能为空。
- 必须使用间接寻址运算符显式通过指针进行间接化。对引用的所有操作都通过引用隐式间接,并改为应用于引用的对象。 引用
- 的分配是引用对象的分配。 获取引用
- 变量的地址就是获取引用对象的地址。
- 指针是数组的迭代器;您可以执行指针算术来迭代元素。将 1 添加到指针会产生指向连续数组元素的指针。没有参考算术。由于隐式间接寻址,向引用添加一个会将一个添加到引用的对象。
这与将常量引用"异常"绑定到临时对象"e"有关吗?
那里有很多正确的词,但我不明白你想说什么意思。
e
是一个变量。变量的类型const std::exception&
即对常量异常的引用。抛出时,引用将绑定到引发的异常对象。