C C 中explicity關鍵字的使用

2021-09-24 10:52:34 字數 1175 閱讀 4193

讀者可以預言下面程式的輸出:

#include using namespace std;

class complex

// 比較操作符==,接受乙個complex的引數

bool operator == (complex rhs)

};int main()

輸出:

same
上面complex的==操作符接受的是乙個complex引數。當程式執行到com1 == 3.0時,程式會自動呼叫complex的構造器並且傳入引數3.0,然後得到乙個新的complex物件,再將這個新物件傳給com1的==操作符。所以程式表面上看起來是complex和double在進行比較,但實際上程式做了隱式的轉化(將double轉成了complex),依然是兩個complex在比較。

在c++中如果乙個類有能夠被單引數所呼叫的構造器,那麼這個構造器就被稱為轉化構造器——轉化構造器允許從單引數到類構造的轉化。c++中能夠接受單引數的構造器預設都是轉化構造器。

那麼如何避免這種隱式的轉化呢?可以使用explicity關鍵字。使用了explicity關鍵字的構造器就不允許上面的隱式轉化,要轉化的話,只能強制轉化。

我們修改後的程式如下:

#include using namespace std;

class complex

// 比較操作符==,接受乙個complex的引數

bool operator== (complex rhs)

};int main()

在案例中,我們可以將double轉化為complex,但是必需強制轉化。

下面是乙個賦值的案例(complex的構造器上無 explicity 關鍵字):

complex com1(3.0, 0.0);

complex com2 = 3.0;//將乙個3.0賦值給complex物件

第乙個語句是傳入引數構造器complex物件,這沒有什麼可討論的。第二個語句將3.0賦值給了complex物件,其實原理和上面是一樣的,首先傳入引數3.0到complex的構造器構造乙個臨時complex物件,然後再將臨時complex物件傳給com2物件。

如果給complex構造器加上explicity關鍵字,那麼就變成如下的形式了:

complex com2 = (complex)3.0;

C C 中volatile關鍵字

c c 中volatile關鍵字 1 沒有volatile關鍵字 include stdio.h void main void b i printf d n b getchar 然後,在 debug 版本模式執行程式,輸出結果如下 i 10 i 32 然後,在 release 版本模式執行程式,輸出...

C C 中const關鍵字

const經常被用到,所以今天總結一下const關鍵字的用法,常用的場景為修飾變數 c c 不同 修飾指標和引用,修飾函式引數,修飾函式返回值,修飾函式定義體 類 成員函式 1 修飾變數 cosnt在修飾變數時,在c和c 中是不同的。const int a 5 intarray a 在c語言中是錯誤...

C C 中extern關鍵字

extern關鍵字可置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數或函式時,在其它模組中尋找其定義。另外,extern也可用來進行鏈結指定。在介紹外部變數之前,先來看一下什麼是區域性變數。下面是乙個例子。include define maxline 1000 int ...