C++ 中explicit的使用

C++提供了關鍵字explicit,可以阻止不應該允許的經過轉換構造函數進行的隱式轉換的發生。聲明為explicit的構造函數不能在隱式轉換中使用。

C++中, 一個參數的構造函數(或者除了第一個參數外其余參數都有默認值的多參構造函數), 承擔了兩個角色。 1 是個構造器?,2 是個默認且隱含的類型轉換操作符。
所以, 有時候在我們寫下如 AAA = XXX, 這樣的代碼, 且恰好XXX的類型正好是AAA單參數構造器的參數類型, 這時候編譯器就自動調用這個構造器, 創建一個AAA的對象。
這樣看起來好象很酷, 很方便。 但在某些情況下(見下面權威的例子), 卻違背了我們(程序員)的本意。 這時候就要在這個構造器前面加上explicit修飾, 指定這個構造器只能被明確的調用,使用, 不能作為類型轉換操作符被隱含的使用。 呵呵, 看來還是光明正大些比較好。
explicit構造函數的作用
解析:
explicit構造函數是用來防止隱式轉換的。請看下面的代碼:
class Test1
{
public:Test1(int n){num=n;}//普通構造函數
private:int num;
};
class Test2
{
public:explicit Test2(int n){num=n;}//explicit(顯式)構造函數
private:int num;
};
int main()
{Test1 t1=12;//隱式調用其構造函數,成功Test2 t2=12;//編譯錯誤,不能隱式調用其構造函數Test2 t2(12);//顯式調用成功return 0;
}
Test1的構造函數帶一個int型的參數,代碼23行會隱式轉換成調用Test1的這個構造函數。而Test2的構造函數被聲明為explicit(顯式),這表示不能通過隱式轉換來調用這個構造函數,因此代碼24行會出現編譯錯誤。
普通構造函數能夠被隱式調用。而explicit構造函數只能被顯式調用。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259494.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259494.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ 1026 windy數 (數位DP)

題意 區間[A,B]上,總共有多少個不含前導零且相鄰兩個數字之差至少為2的正整數? 思路 狀態設計非常簡單,只需要pos、limit和一個前驅數pre就可以了,每次枚舉當前位時判斷是否與上一位相差2即可。一個需要注意的地方是第一位不用比較…

oracle診斷,Oracle?診斷事件列表

Oracle 診斷事件列表(2013-03-26 18:05:26)標簽:oracle診斷事件itORA-10000: controlfile debug event, name control_fileORA-10001: controlfile crash event1ORA-10002: controlfile crash event2ORA-10003: controlfile crash event3ORA-10004: controlfile cra…

考研數學:【以錯補錯】 降低做題出錯率

考研數學:以錯補錯 降低做題出錯率  眾所周知,數學需要做題,需要通過做題來鞏固掌握,但很多同學卻陷入了題海戰術,把所有的精力都放在數學練習上,一門心思做題,可幾個月下來卻沒有進展&#x…

treeview右鍵添加新節點

private void advTree1_MouseDown(object sender, MouseEventArgs e){if (e.Button MouseButtons.Right)//判斷你點的是不是右鍵{Point ClickPoint new Point(e.X, e.Y);Node CurrentNode advTree1.GetNodeAt(ClickPoint);if (CurrentNode ! null)//判斷你點的是不是一個節點…

RPM方式安裝MySQL5.6

RPM方式安裝MySQL5.6 rpm -ivh MySQL-server-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-client-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-devel-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-embedded-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -iv…

centos7靜默搭建oracle11g,Linux靜默安裝Oracle方法(centos7+oracle11g)

1、 增加虛擬內存ddif/dev/zero of/swapadd bs1024 count2006424mkswap /swapaddswapon /swapadd2、 檢查依賴包rpm -q binutils compat-libstdc-33 elfutils-libelf elfutils-libelf-devel gcc gcc-c glibc-2.5 glibc-common glibc-devel glibc-headers ksh libaio libaio-dev…

Ms SQL Server 約束和規則

一、SQL約束 約束定義關于列中允許值的規則,是強制完整性的標準機制。 使用約束優先于使用觸發器、規則和默認值。查詢優化器也使用約束定義生成高性能的查詢執行計劃。 1:類型 約束的類型一共分三種 域約束: 涉及一個或多個列&#xf…

Qt 獨立運行時伴隨CMD命令窗口

用Qt寫了一個小軟件,在把程序release后,打包分裝后,發現程序運行的時候會伴隨cmd命令窗口,可把我愁懷了 不過功夫不負有心人,在老師和我網友的幫助下,終于搞完了 CONFIG:指定工程配置和編譯參數…

Intellij IDEA 快捷鍵整理(dyCopy)

原文:http://www.cnblogs.com/tonycody/p/3257601.html【常規】CtrlShift Enter,語句完成“!”,否定完成,輸入表達式時按 “!”鍵CtrlE,最近的文件CtrlShiftE,最近更改的文件ShiftC…

長豎線及長括號

轉載:http://blog.sina.com.cn/s/blog_6005d4af0101861l.html 文章修改中要求把花括號和豎線變長,查了下發現下面的幾種方法: 1.花括號“{ }”變長: $\left\{...\right\}$; 或者用 $\Big\{...\Big\}$; 2.豎線“|”變長…

php 加入日志功能,php怎么寫一個日志功能的函數

我們要寫一個寫日志的函數,首先需要了解需求,我們一般怎么用日志函數呢?例如,程序執行到某一步,我希望把這個變量(地址)$user_address的值打印到日志,我們希望日志里是這么寫的:xx-xx-xx xx:xx $user_address : 上海市楊浦區xxxxx然后每一條日志都要換行,都有日期時間,假設 函…

Ant簡單工程的構建

1.在Ant的官方網站http://ant.apache.org/bindownload.cgi下載Ant最新版本(我下載的是apache-ant-1.8.2-bin.zip),Ant無需安裝,直接解壓后設置環境變量即可。 2.測試Ant是否安裝成功,在控制臺運行ant命令,出…

MVC學習四

第七節 講述了增加model中類的屬性,由于數據庫中已存在表,表中沒有存在新加的列,所以可以刪除數據庫或者在數據庫中新增一列,另可以在controller中新增一個數據庫初始化的類,并在Global.asax添加初始化數據庫的代碼 …

mysqlpump 備份文件壓縮對比

mysqldump,使用single-transaction,通過管道使用gzip壓縮,20G單數據庫備份real8m15.291suser8m39.617ssys0m16.675s備份文件1.43Gmysqlpump,4線程,使用single-transaction,通過管道使用gzip壓縮&#xff0c…

如何讓Latex公式字體變小

轉載:http://blog.sina.com.cn/s/blog_5e16f1770100gdxh.html 第一種方法:用比較笨的方法,一個一個公式用 \begin{small} \begin{equation} \ldots \end{equation} \end{small} 第二種方法:定義新的變量環境 在開始 \newenvironme…

php 正則表達式驗證金額,php 正則表達式驗證數字

非負浮點數(正浮點數 0):^d(.d)?$正浮點數 ^(([0-9].[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9])|([0-9]*[1-9][0-9]*))$非正浮點數(負浮點數 0) ^((-d(.d)?)|(0(.0)?))$負浮點數 ^(-(([0-9].[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9])|([0-9]*[1-9]…

ASP.NET MVC:會導致鎖定的會話

背景 一直沒有意識到會話的訪問會導致會話鎖定,現在想想這樣設計是非常合理的,不過某些情況下這樣會導致同一個會話的并發訪問非常低(只能串行化),好在MS提供了機制讓我們控制這種鎖。 測試 A頁面:緩存寫入…

.NET重構(四):窗體繼承+模板方法,完美實現組合查詢

導讀:在機房重構中,有好些個查詢都是大同小異,最為顯著的就是組合查詢了。怎樣給自己省事兒,相同的東西能不能重復利用,就成了一個現實的問題。第一遍做機房的時候,使用的更多的是:復制粘貼。學…

github常見操作和常見錯誤!錯誤提示:fatal: remote origin already exists.

原文鏈接:http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果輸入$ git remote add origin gitgithub.com:djqiang(github帳號名)/gitdemo(項目名).git 提示出錯信息:fatal: remote or…

云計算的下半場

經常有人說互聯網上下半場的區別,大體上上半場燒錢,下半場分出勝負。自打美團王興拋出互聯網的下半場的說法,大家意識到這不僅僅是新美大的下半場,這更是整個互聯網行業的下半場。爆炸式的人口紅利帶來互聯網行業上半場的快速增長…