C ++通用数据结构 - 数据字段赋值 - 运算符与复制c'tor

时间:2012-11-29 15:26:09

标签: c++ templates generics constructor variable-assignment

在通用结构中使用赋值运算符而不是复制c'tor,被认为是错误的编码?或者它没关系,因为可能人们普遍认为,如果某种数据类型有特殊的c'tor,那么应该有一个合适的赋值运算符吗?

例如,如果我正在制作我自己的通用链表,请使用 模板 和DATA数据; 每个节点内的字段。所以问题是如果在我的列表代码的某个地方,我可以在两个DATA变量之间使用赋值运算符。

3 个答案:

答案 0 :(得分:0)

  

在泛型中使用赋值运算符而不是复制c'tor   结构,被认为是错误的编码?

问题是笼统的,所以我的回答也是笼统的。

没有。使用赋值运算符本身并不错。像任何东西一样,它可能被误用或实现不正确,但作为一个概念,使用赋值运算符没有任何问题。这就是他们的目的。

答案 1 :(得分:0)

  

例如,如果我使用模板和DATA数据制作我自己的通用链表;每个节点内的字段。所以问题是如果在我的列表代码的某个地方,我可以在两个DATA变量之间使用赋值运算符。

在此示例中,不使用两者,请使用swap。这是更快和异常安全的。

using std::swap;
swap(old, new);

如果使用赋值运算符,首先复制一个副本,然后调用析构函数。

如果使用复制构造函数,则会调用两个析构函数和一个复制构造函数。

如果使用swap,则调用一个swap和一个析构函数。 swap通常很便宜。

答案 2 :(得分:0)

赋值运算符和复制构造函数以及两个不同的东西,但具有相似的功能。至于它被认为是一种不好的做法的问题,通常这样做并不是一个坏主意。它的优点是可以在程序中的任何时间从任何地方调用它。复制构造函数通常仅在对象初始化时调用。

分配操作员有时会导致非常危险的情况。程序员负责检查某些条件,例如自我分配。在这里,如果是链接列表,您还必须销毁该对象在新分配之前保留的先前列表。

我希望这是你想要的。