构造函数在这一行中做了什么?

时间:2013-09-24 20:06:07

标签: c++

我在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;
}

6 个答案:

答案 0 :(得分: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.0)到Complex对象中。

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

答案 1 :(得分:3)

这不是转换,因为明确构造了一个Complex对象:

c1 = Complex(10.0);

然而,这是转换:

c1 = (Complex)20.0;

这是这样的:

c1 = static_cast<Complex>(30.0);

即使构造函数是显式的,上面的两个转换都会起作用,因为它们会调用转换,...​​...好吧,显式。

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

c1 = 40.0;
c1 = 50;

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

答案 2 :(得分:2)

c1 = Complex(10.0);

事实上这就是:

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

此构造函数只是使用param中传递的值初始化成员dReal,并将dImag初始化为0.0

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

评论说您可以将double转换为Complex类型。

在您明确删除的情况下,您可以声明Complex c1 = 10.0 ;,它将隐式为您调用Complex(double _dReal)。但是,如果未对“明确”进行评论,则会禁止“自动”转换,并且您将被迫声明Complex( 10.0 )以便从double“转换”为Complex