2014-09-01 116 views
3

所以我有以下的代码工作得很好:类的构造函数

CMyClass& CMyClass::operator=(DWORD rhs) 

... 

CMyClass exc; 
exc = GetLastError(); 

而且它的一切我期望它(调用=运营商内部的东西。) 我不知道怎么弄它让我可以代替它写像下面这样:

CMyClass exc = GetLastError(); 

我尝试使用上面的,它不叫=操作的功能,而不是只留下我一类,即只有默认的构造函数已调用。

谢谢

+3

写一个转换构造函数'CMyClass(DWORD rhs);'。然后你甚至可以摆脱赋值操作符。 – juanchopanza 2014-09-01 08:41:10

回答

4

构造函数是必需的。

CMyClass(DWORD rhs) 

或明确

explicit CMyClass(DWORD rhs) 

被警告,隐含的构造函数允许该编译;

CMyClass exc = GetLastError(); 

但它也参与了编译器生成的隐式构造和转换。通常情况下最好是明确和书写;

CMyClass exc (GetLastError()); 
+0

好的,谢谢。你可以澄清你的意思吗?它也参与了编译器生成的隐式构造和转换。' – Luke 2014-09-01 08:45:36

+2

基本上,如果另一种类型说'class ABC'有一个类型转换为'DWORD'('operator DWORD();'),那么这也会编译; 'CMyClass exc = abc;'其中'abc'是'ABC'的一个实例。或者更糟的是,如果'CMyClass'是一个函数'void Func(CMyClass)'的参数,那么这将编译'Func(abc)' – Niall 2014-09-01 08:47:46

+0

再次感谢,非常丰富。 – Luke 2014-09-01 08:51:45