首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造函数在这一行中做什么?

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

Stack Overflow用户
提问于 2013-09-24 20:06:06
回答 6查看 148关注 0票数 1

这里有我在c++教程中找到的简单代码。但我不明白这句话:

代码语言:javascript
复制
c1 = Complex(10.0);

在注释中,构造函数可以用于从一种类型转换到另一种类型。谁能解释一下这一刻。谢谢你的帮助。

代码语言:javascript
复制
#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;
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-09-24 20:10:16

就在这里:

代码语言:javascript
复制
Complex(double _dReal)
      : dReal(_dReal), dImag(0.0)
    { cout << "invoke real constructor " << dReal <<endl;}

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

这一行:

代码语言:javascript
复制
c1 = Complex(10.0);

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

编辑:编辑:请注意,这不是真正的转换--它是通过向其传递双值来显式创建Complex对象--您在达西闪烁光提供的答案中有转换的示例。

票数 3
EN

Stack Overflow用户

发布于 2013-09-24 20:10:25

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

代码语言:javascript
复制
c1 = Complex(10.0);

然而,这是一种转换:

代码语言:javascript
复制
c1 = (Complex)20.0;

这个也是如此:

代码语言:javascript
复制
c1 = static_cast<Complex>(30.0);

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

另外两个构造函数不能使用显式构造函数:

代码语言:javascript
复制
c1 = 40.0;
c1 = 50;

在这里,转换是隐式的,也就是说,操作是由赋值的左边的类型所暗示的,而构造函数的存在在右边是一个表达式。在这种情况下,编译器无法应用声明为explicit的构造函数,因此,如果您在上面的声明中取消注释explicit,那么这个片段将不会编译。

票数 3
EN

Stack Overflow用户

发布于 2013-09-24 20:09:55

代码语言:javascript
复制
c1 = Complex(10.0);

事实上,呼吁:

代码语言:javascript
复制
Complex(double _dReal)
  : dReal(_dReal), dImag(0.0)
{
    cout << "invoke real constructor " << dReal <<endl;
}

这个构造函数用param中传递的值初始化成员dReal,并将dImag初始化为0.0

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18991061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档