Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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++类,它正确地实现了一个复制构造函数和一个重载=运算符。正确实施意味着他们正在工作并执行深度复制: Class1::Class1(const Class1 &class1) { // Perform copy } Class1& Class1::operator=(const Class1 *class1) { // perform copy return *this; }_C++_Oop_Copy Constructor - Fatal编程技术网

这种做法可以接受吗? 假设我有一个C++类,它正确地实现了一个复制构造函数和一个重载=运算符。正确实施意味着他们正在工作并执行深度复制: Class1::Class1(const Class1 &class1) { // Perform copy } Class1& Class1::operator=(const Class1 *class1) { // perform copy return *this; }

这种做法可以接受吗? 假设我有一个C++类,它正确地实现了一个复制构造函数和一个重载=运算符。正确实施意味着他们正在工作并执行深度复制: Class1::Class1(const Class1 &class1) { // Perform copy } Class1& Class1::operator=(const Class1 *class1) { // perform copy return *this; },c++,oop,copy-constructor,C++,Oop,Copy Constructor,现在让我们假设我也有这个构造函数: Class1::Class1(Class1 *class1) { *this = *class1; } 我的问题是,上述建造师是否可以接受?这是我继承并维护的代码。就我个人而言,我认为这不是一个好做法 对于构造函数来说,很难想象从指向对象的指针到对象本身的隐式转换会在什么地方有用 指针没有理由指向非常量,如果您有指向该类的可用指针,则不难取消对它的引用,因此明确说明您希望使用复制构造函数复制对象的意图 类似地,对于非标准赋值运算符,在调用站点正确解引用

现在让我们假设我也有这个构造函数:

Class1::Class1(Class1 *class1)
{
   *this = *class1;
}

我的问题是,上述建造师是否可以接受?这是我继承并维护的代码。

就我个人而言,我认为这不是一个好做法

对于构造函数来说,很难想象从指向对象的指针到对象本身的隐式转换会在什么地方有用

指针没有理由指向非常量,如果您有指向该类的可用指针,则不难取消对它的引用,因此明确说明您希望使用复制构造函数复制对象的意图

类似地,对于非标准赋值运算符,在调用站点正确解引用时,为什么允许从指针赋值更清晰、更惯用?

出于以下原因,我会说“否”:

  • 传统的复制构造函数将其参数接受为常量引用,而不是指针
  • 即使接受指针作为参数,它也应该是
    const Class1*
    ,表示参数不会被修改
  • 此复制构造函数效率低下(或无法工作!),因为
    Class1
    的所有成员都是默认初始化的,然后使用
    operator=
  • operator=
    也有同样的问题;它应该接受引用,而不是指针

operator=
中“重用”复制构造函数的传统方法是。我建议这样实现这个类。

对象和指向对象的指针是两件截然不同的事情。通常,当您传递对象时,您希望它们将被复制(不过,理想情况下,函数将尽可能采用常量引用,以减少/消除不必要的复制)。在传递指针时,不希望发生任何复制。您正在传递一个指向特定对象的指针,根据代码的不同,处理该特定对象而不是它的副本可能真的很重要

将指针指向类型的赋值运算符和构造函数(尤其是可用于隐式转换的构造函数)确实会弄乱事情,并极有可能创建非预期的副本,这不仅可能是性能问题,还可能导致错误


我想不出有什么好的理由让你想要在指向类型的指针和类型本身之间进行隐式转换,甚至显式转换。实现这一点的内置方法是取消对对象的引用。我想可能有一些特定的情况,我想不出这种事情在哪里是必要的,或者是一个好主意,但我真的很怀疑。当然,我强烈建议您不要这样做,除非您有一个明确且充分的理由这样做。

我认为比目前讨论的更重要的问题是,您的非标准赋值运算符不会阻止编译器生成标准赋值运算符。因为您已经决定需要创建赋值运算符(因为您创建了复制构造函数,所以这是一个不错的选择),所以默认值几乎肯定是不够的。因此,这个类的用户在几乎所有人看来都是非常基本和标准的对象使用过程中可能会遇到这个问题。

在我使用这个类的代码中,我计划只使用复制构造函数,而不是有问题的构造函数,仅供参考。很好,我们会说。感谢您记住,复制和交换不会解决上述任何问题。特别是,提到的效率低下问题仍然存在。不过,复制和交换在设计具有强异常保证的类时很有用,所以这是一个很好的实践。