Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;通用数据结构-数据字段赋值运算符与副本c';托尔_C++_Templates_Generics_Constructor_Variable Assignment - Fatal编程技术网

C++ C++;通用数据结构-数据字段赋值运算符与副本c';托尔

C++ C++;通用数据结构-数据字段赋值运算符与副本c';托尔,c++,templates,generics,constructor,variable-assignment,C++,Templates,Generics,Constructor,Variable Assignment,在泛型结构中使用赋值运算符而不是复制c'tor是否被认为是糟糕的编码?或者这并不重要,因为人们普遍认为,如果某个数据类型有一个特殊的c'tor,那么也应该有一个合适的赋值运算符 例如,如果我正在制作自己的通用链表,请使用 模板 数据和数据; 每个节点内的字段。所以问题是,在列表代码的某个地方,我是否可以在两个数据变量之间使用赋值运算符 是否在泛型中使用赋值运算符而不是复制c'tor 结构,被认为是糟糕的编码 这个问题是笼统的,所以我的回答也是笼统的 不。使用赋值运算符本身就是一种不错的编码方式。

在泛型结构中使用赋值运算符而不是复制c'tor是否被认为是糟糕的编码?或者这并不重要,因为人们普遍认为,如果某个数据类型有一个特殊的c'tor,那么也应该有一个合适的赋值运算符

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

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

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

不。使用赋值运算符本身就是一种不错的编码方式。与任何东西一样,它也可能被误用或错误地实现,但作为一个概念,使用赋值运算符并没有什么错。这就是他们在那里的目的

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

在本例中,不使用这两个选项,而是使用
swap
。这是更快和异常安全的

using std::swap;
swap(old, new);
如果使用赋值运算符,首先生成一个副本,然后调用析构函数

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


如果使用swap,则调用一个
swap
和一个析构函数<代码>交换通常很便宜。

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

赋值运算符有时会导致非常危险的情况。程序员负责检查某些条件,例如自我分配。在这里,对于您的链表,您还必须销毁对象在新分配之前保存的以前的列表


我希望这就是您想要问的。

您能提供一两个具体示例吗?赋值运算符和复制构造函数做不同的事情。它们根本不能互换。这不是编码好坏的问题,主要是其中一方不做另一方的工作。确切的问题是什么?赋值运算符和复制构造函数是两种不同的东西。最简单的例子是,若我使用模板和数据制作自己的通用链表;每个节点内的字段。所以问题是,在我的列表代码的某个地方,我是否可以在两个数据变量之间使用赋值运算符。任务可以在任何时候完成。你们在分配任务时必须格外小心,而不是在复制构造函数中。