c++ 隱式類型別轉換
《c++ primer》中提到:
「可以用單個形參來呼叫的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。」
這裡應該注意的是, 「可以用單個形參進行呼叫」 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。」
那麼,什麼是「隱式轉換」呢? 上面這句話也說了,是從 建構函式形參型別 到 該類型別 的乙個編譯器的自動轉換。
pragma once
class cexample
;
#include "stdafx.h"
#include "example.h"
cexample::cexample(void)
: m_ifirst(0)
cexample::~cexample(void)
cexample::cexample(int ifirst, int isecond):m_ifirst(ifirst), m_isecond(isecond)
#include "example.h"
int _tmain(int argc, _tchar* ar**)
如果在建構函式宣告中加入關鍵字explicit,如下
explicit cexample(int ifirst, int isecond = 4);
那麼cexample objfour = 12; 這條語句將不能通過編譯。在vs05下的編譯錯誤提示如下
error c2440: 『initializing』 : cannot convert from 『int』 to 『cexample』
constructor for class 『cexample』 is declared 『explicit』
對於某些型別,這一情況非常理想。但在大部分情況中,隱式轉換卻容易導致錯誤(不是語法錯誤,編譯器不會報錯)。隱式轉換總是在我們沒有察覺的情況下悄悄發生,除非有心所為,隱式轉換常常是我們所不希望發生的。通過將建構函式宣告為explicit(顯式)的方式可以抑制隱式轉換。也就是說,explicit建構函式必須顯式呼叫。
class string;
string s1 = 'a'; //錯誤:不能做隱式char->string轉換
string s2(10); //可以:呼叫explicit string(int n);
string s3 = string(10);//可以:呼叫explicit string(int n);再呼叫預設的複製建構函式
string s4 = "brian"; //可以:隱式轉換呼叫string(const char *p);再呼叫預設的複製建構函式
string s5("fawlty"); //可以:正常呼叫string(const char *p);
void f(string);
string g()
{ f(10); //錯誤:不能做隱式int->string轉換
f("arthur"); //可以:隱式轉換,等價於f(string("arthur"));
return 10; //同上
C 類型別隱式轉換
隱式類型別轉換 可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的乙個隱式轉換。c primer 首先要單個實參,你可以把建構函式colour的預設實參去掉,也就是定義乙個物件必須要兩個引數的時候,檔案編譯不能通過。以上只是將內建型別轉換為自定義型別 過載double,int 將使用者自定義資...
C 隱式類型別轉換
c primer 中提到 可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。這裡應該注意的是,可以用單個形參進行呼叫 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。那麼,什麼是 隱式轉換 呢?上面這句話也說了,是從 建構函式形參型...
C 隱式類型別轉換
c primer 中提到 可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。這裡應該注意的是,可以用單個形參進行呼叫 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。那麼,什麼是 隱式轉換 呢?上面這句話也說了,是從 建構函式形參型...