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