1

我在 c++ 教程中找到了简单的代码。但我无法理解这一行:

c1 = Complex(10.0);

在评论中写道,构造函数可用于从一种类型转换为另一种类型。有人可以解释这一刻。感谢您的任何帮助。

#include <iostream>
using namespace std;

class Complex
{
  public:
    Complex() : dReal(0.0), dImag(0.0)
    { cout << "invoke default constructor" << endl;}
    /*explicit*/ Complex(double _dReal)
      : dReal(_dReal), dImag(0.0)
    { cout << "invoke real constructor " << dReal <<endl;}
    Complex(double _dReal, double _dImag)
      : dReal(_dReal), dImag(_dImag)
    {
        cout << "invoke complex constructor " << dReal
             << ", " << dImag << endl;
    }

    double dReal;
    double dImag;
};

int main(int argcs, char* pArgs[])
{
    Complex c1, c2(1.0), c3(1.0, 1.0);

    // constructor can be used to convert from one type
    // to another
    c1 = Complex(10.0);

    // the following conversions work even if explicit
    // is uncommented
    c1 = (Complex)20.0;
    c1 = static_cast<Complex>(30.0);

    // the following implicit conversions work if the
    // explicit is commented out
    c1 = 40.0;
    c1 = 50;

    system("PAUSE");
    return 0;
}
4

6 回答 6

3

就在这里:

Complex(double _dReal)
      : dReal(_dReal), dImag(0.0)
    { cout << "invoke real constructor " << dReal <<endl;}

是一个构造函数,它将从中double创建Complex对象。您可以看到它将实部 ( dReal) 设置为传递给构造函数 ( _dReal) 的值,并将虚部设置为 0。

这一行:

c1 = Complex(10.0);

将调用该构造函数,并将传递的实数 ( ) 转换为对象10.0Complex

编辑:请注意,这不是真正的转换 - 它是Complex通过将双精度传递给它来显式创建对象 - 您在 dasblinkedlight 提供的答案中有转换示例。

于 2013-09-24T20:10:16.773 回答
3

这不是转换,因为Complex显式构造一个对象:

c1 = Complex(10.0);

然而,这是一个转换:

c1 = (Complex)20.0;

这是这样的:

c1 = static_cast<Complex>(30.0);

即使构造函数是显式的,上述两种转换都可以工作,因为它们调用转换,...​​嗯,显式的。

另外两个不适用于显式构造函数:

c1 = 40.0;
c1 = 50;

这里的转换是隐式的,即操作是由赋值左侧的类型隐含的,并且构造函数的存在采用右侧的表达式。编译器无法应用explicit在这种情况下声明的构造函数,因此如果您explicit在上面的声明中取消注释,则此代码段将无法编译。

于 2013-09-24T20:10:25.490 回答
2

这个

c1 = Complex(10.0);

实际上是这样的:

Complex(double _dReal)
  : dReal(_dReal), dImag(0.0)
{
    cout << "invoke real constructor " << dReal <<endl;
}

此构造函数仅dReal使用传入参数的值初始化成员并初始化dImag0.0.

当他们说您可以将一种类型转换为另一种时,我猜他们想说您可以“转换”doubleComplex.

于 2013-09-24T20:09:55.687 回答
1

c1 = Complex(10.0);创建一个Complex对象并将其复制到c1.

于 2013-09-24T20:09:34.040 回答
1

T(x)任何给定类型T和对象x(或对象)的表达式都会创建一个使用给定参数构造x1,x2...的临时类型。T

于 2013-09-24T20:10:23.607 回答
1

c1 = Complex(10.0);调用你的隐式构造函数/*explicit*/ Complex(double _dReal)

评论说您可以转换doubleComplex类型。

在显式被删除的情况下,您可以声明Complex c1 = 10.0 ;哪个会隐式调用Complex(double _dReal)您。但是,如果没有注释显式,它将禁止“自动”转换,并且您将被迫声明Complex( 10.0 )以便从 '转换'doubleComplex

于 2013-09-24T20:14:41.670 回答