这里有我在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;
}发布于 2013-09-24 20:10:16
就在这里:
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对象。
编辑:编辑:请注意,这不是真正的转换--它是通过向其传递双值来显式创建Complex对象--您在达西闪烁光提供的答案中有转换的示例。
发布于 2013-09-24 20:10:25
这不是一个转换,因为显式地构造一个Complex对象:
c1 = Complex(10.0);然而,这是一种转换:
c1 = (Complex)20.0;这个也是如此:
c1 = static_cast<Complex>(30.0);即使构造函数是显式的,上述两种转换都可以工作,因为它们显式地调用转换( ...well )。
另外两个构造函数不能使用显式构造函数:
c1 = 40.0;
c1 = 50;在这里,转换是隐式的,也就是说,操作是由赋值的左边的类型所暗示的,而构造函数的存在在右边是一个表达式。在这种情况下,编译器无法应用声明为explicit的构造函数,因此,如果您在上面的声明中取消注释explicit,那么这个片段将不会编译。
发布于 2013-09-24 20:09:55
这
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。
https://stackoverflow.com/questions/18991061
复制相似问题