【问题标题】:Why is returning a constructor allowed in operator overloading?为什么在运算符重载中允许返回构造函数?
【发布时间】:2014-09-01 23:43:27
【问题描述】:

为什么在运算符重载中允许返回构造函数?

这是一个例子:

Complex Complex::operator*( const Complex &operand2 ) const
{
    double Real = (real * operand2.real)-(imaginary * operand2.imaginary);
    double Imaginary = ( real * operand2.imaginary)+(imaginary * operand2.real);

    return Complex ( Real, Imaginary );
}

似乎返回的是对象的构造函数,而不是对象本身?它在那里返回什么?

这似乎更有意义:

Complex Complex::operator*( const Complex &operand2 ) const
{
    double Real = (real * operand2.real)-(imaginary * operand2.imaginary);
    double Imaginary = ( real * operand2.imaginary)+(imaginary * operand2.real);

    Complex somenumber ( Real, Imaginary );

    return somenumber;
}

【问题讨论】:

  • Complex(...)Complexinstance 的构造。构造函数用于初始化该类型的对象,在本例中为临时对象。
  • “返回构造函数”???到底是什么让你断定它是“返回构造函数”?在 C++ 语言中,构造函数的名称类似于 Complex::Complex。注意 - 两个相同的部分由 :: 分隔。那将是一个构造函数名称。现在,在您发布的代码中,您在哪里看到任何看起来像构造函数的东西?
  • 为什么不return {Real, Imaginary};
  • 我以前从未见过这种语法。语法是否与马特在下面的回答相同?

标签: c++ constructor operator-overloading


【解决方案1】:

在 C++ 中,语法:Typename (arguments) 表示创建一个 Typename 1 类型的未命名对象(也称为临时对象) .参数被传递给该对象的构造函数(或用作原始类型的初始值设定项)。

它的含义与您的第二个示例非常相似:

Complex somenumber( Real, Imaginary);
return somenumber;

唯一的区别是对象有一个名字。

两个版本之间在将对象复制或移回调用函数方面存在一些细微差别。 More info here

1 除非是part of a function declaration

【讨论】:

  • 马特,我编辑了第二个例子。是的,这没有多大意义,因为 () 运算符在 Complex 中没有重载。
  • 至于你提到的复制/移动构造函数,使用第一个版本并返回一个未命名的临时对象更好吗?
  • @Overtaker 我认为它们在技术上是等效的,尽管从历史上看,一些编译器省略了案例 1 但没有省略案例 2。(不过我对此并不完全确定)
  • 好的,感谢您的帮助!我看到书籍使用案例 1,所以我可能会坚持下去。至于Typename(参数),你的意思是说类名(参数)吗?
  • @Overtaker 否。类名是类型名,但您也可以使用非类名(例如 return int(5);
猜你喜欢
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2019-11-27
  • 2010-09-10
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多