2008年10月14日 星期二

explicit constructor

考慮一個問題

class MyClass
{
public:
MyClass();
MyClass(BOOL bAutoDelete = TRUE);
}

int a = 4;
MyClass b;
b = a; // 這一行complier竟然會沒有error和warning??


因為complier在編譯的時候會implicit做一些轉換,例如在這一個MyClass assignment的地方
1. 找MyClass有沒有支援operator=(int)的function (找不到!!)
2. 找int 有沒有轉換成MyClass的conversion function (找不到!!)
3. 找MyClass有沒有int 的constructor (bingo!! ps1)

在這個情況底下.. 我們需要的是 b = a.. complier應該要給我們一個錯誤訊息才對..
implicit的constructor不是我們需要的.. 所以要在constructor前面加一個explicit
避免complier幫你做隱式的轉換


class MyClass
{
public:
MyClass();
explicit MyClass(BOOL bAutoDelete = TRUE);
}

int a = 4;
MyClass b;
b = a; // error
b = MyClass(a); // ok




ps1 因為BOOL是實際上是int (Visual C++)
typedef int BOOL;
#define TRUE 1
#define FALSE 0

沒有留言:

LinkWithin

Related Posts with Thumbnails