1. 程式人生 > >C++中explicit的用法【轉】

C++中explicit的用法【轉】


C++中, 一個引數的建構函式(或者除了第一個引數外其餘引數都有預設值的多參建構函式), 承擔了兩個角色。 

1 是個構造;2 是個預設且隱含的型別轉換操作符。

所以, 有時候在我們寫下如 AAA = XXX, 這樣的程式碼, 且恰好XXX的型別正好是AAA單引數構造器的引數型別, 這時候編譯器就自動呼叫這個構造器, 建立一個AAA的物件。

這樣看起來好象很酷, 很方便。 但在某些情況下, 卻違背了程式設計師的本意。 這時候就要在這個構造器前面加上explicit修飾, 指定這個構造器只能被明確的呼叫/使用, 不能作為型別轉換操作符被隱含的使用。


解析:explicit建構函式是用來防止隱式轉換的。請看下面的程式碼:

#include <iostream>
using namespace std;
class Test1
{
public :
    Test1(int num):n(num){}   //普通建構函式
private:
    int n;
};
class Test2
{
public :
    explicit Test2(int num):n(num){}    //explicit(顯式)建構函式
private:
    int n;
};
 
int main()
{
    Test1 t1 = 12;//隱式呼叫其建構函式,成功
    Test2 t2(13);//顯式呼叫成功
    Test2 t3 = 14;//編譯錯誤,不能隱式呼叫其建構函式
        
    return 0;
}

注意:當類的宣告和定義分別在兩個檔案中時,explicit只能寫在在宣告中,不能寫在定義中。
 

相關推薦

C++explicit用法

C++中, 一個引數的建構函式(或者除了第一個引數外其餘引數都有預設值的多參建構函式), 承擔了兩個角色。  1 是個構造;2 是個預設且隱含的型別轉換操作符。 所以, 有時候在我們寫下如 AAA = XXX, 這樣的程式碼, 且恰好XXX的型別正好是AAA單引數構

c++冒號(:)和雙冒號(::)的用法

(轉自:https://blog.csdn.net/zimingjushi/article/details/6549390?utm_source=blogxgwz1)   1.冒號(:)用法 (1)表示機構內位域的定義(即該變數佔幾個bit空間) typedef struct _X

linux C函式之access函式的用法

1.函式功能: 檢查呼叫程序是否可以對指定的檔案執行某種操作。 2.函式原型: 1)函式標頭檔案 #include <stdio.h> #include <unistd.h> 2)函式 int access(

do...while(0)在巨集定義的巧妙用法

大家都知道,do…while(condition)可以表示迴圈,但你有沒有遇到在一些巨集定義中可以不用迴圈的地方,也用到了 do…while.比如:   #define DELETE_POINTER(p) \ do \ { \ if

Net編程 詳解DataTable用法

security 操作 出錯 eight 按鈕 rdate sum 客戶 基本 http://www.diybloghome.com/article/16.html DataTable表示一個與內存有關的數據表,可以使用工具欄裏面的控件拖放來創建和使用,也可以在編寫程序過

字符串處理算法字符串包含的算法設計及C代碼實現

字符串 整數 blank -- c語言 ipp lines c118 多個 轉自:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50679587 版權聲明:本文為博主原創文章,對文章內容有任何意見或建議,

音頻增益響度分析 ReplayGain 附完整C代碼示例

.html ssi ifdef bar read IT 輸出 標準 avi 轉自:http://www.cnblogs.com/cpuimage/p/8846951.html 人們所熟知的圖像方面的3A算法有: AF自動對焦(Automatic Focus)自動對焦即調

GridControl常見用法

解決 綁定 tst add strong 指定 value option xtra 剛接觸DevExpress第三方控件,把GridControl的常見用法整理一下,以供參考: 說明: gcTest GridControl gvText GridVie

詳解C# 叠代器

mov 添加 除了 叠代 RF 發生 time 初始 奇怪 叠代器模式是設計模式中行為模式(behavioral pattern)的一個例子,他是一種簡化對象間通訊的模式,也是一種非常容易理解和使用的模式。簡單來說,叠代器模式使得你能夠獲取到序列中的所有元素而不

PCB智能生產MES系統在設備管理的應用

數據備份 圖片 工廠 技術管理 模塊 審核 計算機技術 資產 模式 01 設備管理中的MES系統與ERP系統的區別 從ERP的角度來看,設備管理的功能主要服務於企業管理,其中ERP管理系統主要管理設備前期與中期業務,包括設備招投標、設備購置、設備安裝調試、以舊中期的設備固定

11條最全面的C/C++編碼規範總結

(轉自:https://blog.csdn.net/zang141588761/article/details/50608736) 對於不同的程式語言來說,具體的編碼規範可以有很大的不同,但是其宗旨都是一致的,就是保證程式碼在高質量完成需求的同時具備良好的可讀性、可維護性。例如我們可以

為什麼inline函式應該在標頭檔案定義?

(轉自:https://blog.csdn.net/ronnie_hu/article/details/62238311) inline函式(即行內函數)對編譯器而言必須是可見的,以便能夠在呼叫點展開該函式,與非inline函式不同的是,inline函式必須在呼叫該函式的每個檔案中定義。當然,對

C++ 名稱空間namespace

(轉自:https://blog.csdn.net/touzani/article/details/1637776?utm_source=blogxgwz7) 名稱空間 在C++中,名稱(name)可以是符號常量、變數、巨集、函式、結構、列舉、類和物件等等。為了避免,在大規模程式的設計中,以

c語言指標學習

  前言   近期俄羅斯的隕石、四月的血月、五月北京的飛雪以及天朝各種血腥和混亂,給人一種不詳的預感。佛祖說的末法時期,五濁惡世 ,十惡之世,人再無心法約束,道德淪喪,和現在正好吻合。尤其是在天朝,空氣,水,食品,你能告訴還有沒有問題的嗎?不知大難至,世人依舊忙。禍福相依,危中有機。那些高階生命,

qemu使用9p,支援host和guest共享目錄

轉自:https://blog.csdn.net/ayu_ag/article/details/52956351 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/ayu_ag/article/details/529563519p是啥,網路檔案系統,用於共享目

說下Interface的用法

1.介面的概述 主要是使用介面來拓展定義類的功能,可以彌補java中單繼承的缺點。 2.介面的定義格式 interface 介面名{ 屬性 抽象方法 } 介面的體驗 interface Inter { int num = 6; 可以定義屬性與方

棧在表示式計算過程的應用

棧在表示式計算過程中的應用 :建立運算元棧和運算子棧。運算子有優先順序。 規則:  自左至右掃描表示式,凡是遇到運算元一律進運算元棧。  當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算

“棧”的典型應用—表示式求值(C語言實現)

我們都知道算術四則運算的運算規則是: 先乘除,後加減。 從左到右計算 先算括號內,再算括號外 表示式組成 任何一個表示式都有運算元、運算子和界定符組成。 運算元即可以是常量,也可以是被說明為變數或常量的識別符號。 運算子可以分為算術運算,關係運算和邏輯運

[IOS]hitTest的作用與用法

轉載自:  http://blog.sina.com.cn/s/blog_446da0320100yw9u.html hitTest的作用:當在一個view上新增一個遮蔽罩,但又不影響對下面view的操作,也就是可以透過遮蔽罩對下面的view進行操作,這個函式就很好用了

crontab命令用法

部分引數說明 crontab file [-u user]-用指定的檔案替代目前的crontab。 crontab-[-u user]-用標準輸入替代目前的crontab. crontab-1[user]-列出使用者目前的crontab. crontab-e[user]-編輯使用者目前的crontab. cr