【问题标题】:operator = on vectors of different dimensions运算符 = 在不同维度的向量上
【发布时间】:2014-03-09 21:28:24
【问题描述】:

考虑以下代码:

class vector{
   // ...
   vector(int size){ /*...*/ };
   vector& operator= (const vector& other){
   // ...
   }
};

int main(){
   vector v1(5), v2(10);
   v1 = v2;
}

我的operator = 应该在这里做什么? v1 没有足够的容量来存储 v2 的元素。从我的角度来看,它可以将自身重新初始化为 10 的容量并复制其他向量的元素或抛出异常。我通常选择前一种方法,但越来越经常看到后一种方法。哪一个是正确的?

【问题讨论】:

  • 你在问std::vector 做什么?或者您是在就您自己的向量类中应该做什么寻求建议?
  • 还请注意,一个好的实现是使用复制交换习语,这意味着您的复制构造函数也必须具有这种抛出行为,并且会以可怕的方式结束。
  • @BenjaminLindley:我在问一个自定义向量类! :)

标签: c++ operators assignment-operator assign


【解决方案1】:

这完全取决于vector 是什么

如果它是一个自动调整大小的向量,您会期望调整大小。 std::vector 就是这样做的。

如果它是用于矩阵运算的数学向量,并且您不允许改变向量大小,那么它应该抛出异常。

【讨论】:

  • 感谢您指出数学向量的问题 :)
【解决方案2】:

通常用户会期望在赋值 x = y 之后,相等性 x == y 应该为真:赋值赋予语义等价性。做任何其他事情都是非常不寻常和令人惊讶的。这可能包括不抛出异常以响应指令“make x like y”。

【讨论】:

  • 奇怪的例子。如果它抛出异常,你怎么能指望x == y
  • @KarolyHorvath:不过,您不会期望检查作业是否有异常。
  • 这就是为什么它被称为 exception ;) 例如:你可能会耗尽内存。
  • 谢谢,这就是我想听到的答案:D
猜你喜欢
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 2018-10-16
  • 2015-08-14
  • 1970-01-01
相关资源
最近更新 更多