在通用结构中使用赋值运算符而不是复制 c'tor 是否被认为是错误的编码?或者这无关紧要,因为也许人们普遍认为,如果某个数据类型有一个特殊的 c'tor,那么也应该有一个适当的赋值运算符?
例如,如果我正在制作自己的通用链表,使用模板和 DATA 数据;每个节点内的字段。所以问题是,如果在我的列表代码的某个地方,我可以在两个 DATA 变量之间使用赋值运算符。
在通用结构中使用赋值运算符而不是复制 c'tor 是否被认为是错误的编码?或者这无关紧要,因为也许人们普遍认为,如果某个数据类型有一个特殊的 c'tor,那么也应该有一个适当的赋值运算符?
例如,如果我正在制作自己的通用链表,使用模板和 DATA 数据;每个节点内的字段。所以问题是,如果在我的列表代码的某个地方,我可以在两个 DATA 变量之间使用赋值运算符。
在通用结构中使用赋值运算符而不是复制 c'tor 是否被认为是错误的编码?
这个问题是笼统的,所以我的回答也是笼统的。
不,使用赋值运算符本身并不是不好的编码。像任何事情一样,它可能会被误用或不正确地实现,但作为一个概念,使用赋值运算符并没有错。这就是他们的目的。
例如,如果我正在制作自己的通用链表,使用模板和 DATA 数据;每个节点内的字段。所以问题是,如果在我的列表代码的某个地方,我可以在两个 DATA 变量之间使用赋值运算符。
在此示例中,两者都不使用,使用swap
. 这更快且异常安全。
using std::swap;
swap(old, new);
如果使用赋值运算符,首先会创建一个副本,然后调用析构函数。
如果使用复制构造函数,则调用两个析构函数和一个复制构造函数。
如果使用交换,则swap
调用一对一的析构函数。swap
通常很便宜。
赋值运算符和复制构造函数和两个不同的东西虽然具有相似的功能。至于它是否被认为是一种不良做法的问题,通常这样做并不是一个坏主意。它的优点是几乎可以在程序中的任何时间从任何地方调用它。复制构造函数通常只在对象初始化时调用。
赋值运算符有时会导致非常危险的情况。程序员负责检查某些条件,例如自赋值。在这里,如果是您的链表,您还必须销毁对象在新分配之前确实持有的前一个列表。
我希望这是你想问的。