2016-10-04 71 views
3

有人可以解釋爲什麼以下工作,試了下面的代碼,它工作正常。從指針轉換爲非標量對象類型?

class A { 
public : 
    int32_t temp ; 
    A (bool y = false ) { } 
} ; 

int main (int argc, char *argv[]) 
{ 

    A temp ; 
    temp = new A() ; 
    temp.temp = 5 ; 

    std::cout << " " << temp.temp << std::endl ; 
    return EXIT_SUCCESS; 
}    // ---------- end of function main ---------- 

回答

7

對你而言。編譯器使用了implicitly defined Copy/Move Assignment operator。其中第一個構造A與指針使用您的構造函數,需要bool


所有指針類型是implicitly convertiblebool在C++中。有兩種方法可以防止這樣的廢話:

  • explicit構造
  • deleted構造

因此,你可以這樣做:

class A { 

    public : 
    int32_t temp ; 
    explicit A(bool y = false ) { 
    } 

    //Additionally 
    A(void*) = delete; 
}; 

定義構造函數只需要一個void*作爲刪除,將有overload resolution排名構造函數高於當你傳遞一個指針時,它的構造函數是。由於每當你傳遞一個指針並且由於它被刪除,它都會被重載解析所挑選,所以程序將不合格。