2

在 C# 中,当您从堆栈中弹出时,它会从堆栈中删除对象并返回该对象。

但是,在 C++ 中因为http://blogs.msdn.com/b/zhanli/archive/2010/06/29/c-tips-why-the-pop-method-of-stl-stack-does-not- return-a-value.aspx,pop 函数不会返回对象。

是什么让 C# 能够做 C++ 做不到的事情?还是更像 C# 不关心这种异常情况是否发生?“如果 operator= 或复制构造函数抛出异常,那么我们将遇到麻烦:堆栈的内部状态已经改变,但我们还没有得到弹出的元素。” (来自链接)

4

2 回答 2

5

就是在 C++ 中,您返回集合中项目的副本,但在 C# 中,您返回的是引用。返回引用保证不会抛出异常。

于 2013-10-25T04:31:16.403 回答
3

因为在 C# 中,操作是“便宜的”——它只是返回结构或对象引用的逐字节副本。

在 C++ 中,返回对象是昂贵的——它需要通过调用复制构造函数来复制对象本身,这实际上可能涉及用户指定必须发生的任何事情,包括(但不限于)分配新资源和销毁旧资源那些。

(例如,假设要返回的对象是一棵二叉树。与复制它相比,复制它会非常int昂贵,比如说, 。)

C++11本来可以使用“移动语义”来避免复制对象,但是移动语义是在 is之后 pop_back引入的,他们并没有费心去改变它。

于 2013-10-25T04:31:24.773 回答