2013-05-03 109 views
0
#include <iostream> 

using namespace std; 

class A 
{ 
private: 
    float data_member; 
public: 
    A(int a); 
    explicit A(float d); 
}; 


A::A(int a) 
{ 
    data_member = a; 
} 

A::A(float d) 
{ 
    data_member = d; 
} 

void Test(A a) 
{ 
    cout<<"Do nothing"<<endl; 
} 

int main() 
{ 
    Test(12); 
    Test(12.6); //Expecting a compile time error here 
    return 0; 
} 

我期待錯誤int這種情況下,因爲我的CTOR採取浮動值是顯式的。但是我在VS 2010中沒有收到任何錯誤。請指出我是否對我對C++中關鍵字「EXPLICIT」的理解有誤。爲什麼我在下面的代碼中沒有出錯?

+0

瞭解明確的關鍵字的用法如下: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean – 2013-05-03 05:45:31

+0

@AayushiJain的評論謝謝,但我已經閱讀了這篇文章。 – 2013-05-03 05:56:59

回答

4
explicit A(float d); 

您是否認爲它確實如此。它禁用從float到類型A的隱式轉換。簡而言之,它會禁用任何隱式轉換,其中浮點將被隱式轉換爲A的對象。例如:

void doSomething(A obj){} 

doSomething(2.3); 

它不禁用標準允許的任何隱式轉換。


爲什麼它編譯?

Test(12.6); 

由於float參數隱式轉換爲int

float a = 12.6; 
int b = (int)a; 

此外,轉換構造A::A(int a)用於創建其被傳遞給該方法Test()A類型的對象:作爲發生什麼幕後是一樣的。


爲什麼,如果你刪除explicit它不能編譯?

沒有關鍵字explicit轉換構造A::A(float d)可用於轉化和因爲有兩個可能的匹配,轉換12.6A類型的反對這創造了一個模糊性:

A::A(int a) 

A::A(float d) 

由於在最佳匹配方面沒有其他方面得分,所以co mpiler發出歧義的診斷。

+0

但我如何得到主函數中第二行的編譯時錯誤。 – 2013-05-03 05:18:09

+0

@Apoorvasahay通過清除明確,你可以得到編譯時錯誤 – 2013-05-03 05:19:31

+0

@ ling.s然後什麼是顯式關鍵字的使用。據我所知,明確的關鍵字應該用於禁用隱式轉換。我的目標不是讓這些代碼可編譯,而是要了解顯式關鍵字的用法。 – 2013-05-03 05:23:03

相關問題