繁体   English   中英

定义显式重载构造函数问题

[英]defining explicit overloaded constructor issue

我有以下课程,某些运算符已重载:

class CLASS1
{
       CLASS1();
       CLASS1(const CLASS1 &obj);

   CLASS1 operator +(const CLASS1 &obj) {
       CLASS1 srcObj;
       // doing add stuff here
           return srcObj;
       }

   void func()
   {
   CLASS1 boj = // some method which returns CLASS1 obj.
   }


   CLASS1& operator =(const CLASS1 &obj) {
       // copy properties
       }
}

好的,这很好。 但是过了一会儿,我决定让我的班级显式以避免隐式转换。 因此,我这样做是这样的:

class CLASS1
{
       explicit CLASS1();
       explicit CLASS1(const CLASS1 &obj);

   CLASS1 operator +(const CLASS1 &obj) {
       CLASS1 srcObj;
       // doing add stuff here
           return srcObj;          // compiler gives non-matching errors
   }

   void func() {
       CLASS1 boj = somemethods(); // compiler gives non-matching errors
   }

   CLASS1& operator =(const CLASS1 &obj) {
       // copy properties
       }
}

现在,尽管我显式重载了赋值运算符,但编译器给出了“没有匹配的函数来调用...”错误(在上面的代码中指定)。 我的错误在哪里?

当按值返回对象时,将隐式调用copy-constructor。 如果您说不允许隐式调用它,则会出现错误。

您不应该对explicit ,复制或移动构造函数使用explicit 或对于采用多个参数的构造函数。 仅适用于采用单个参数的构造函数(带有注明的异常)。

从技术上讲,从方法返回对象时,在方法调用外部收到的对象实际上是在方法内部声明的对象的副本。 因此,编译器必须具有一种允许的方法,以将方法内对象中的“内容”转移到方法结果中。 由于不再需要方法中的实例,因此移动是最好的方法(是的,您需要添加move构造函数):

CLASS1(CLASS1&& obj);

这将允许您禁止隐式转换,同时保持拥有临时对象的能力。

在现实生活中,上述复制/移动很可能会通过RVO / NRVO进行优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM