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

C+中explicit的用法

explicit 是避免建構函式的引數自動轉換為類物件的識別符號

[cpp] view plaincopyprint?
  1. #include <iostream>   
  2. using namespace  std;  
  3. class A  
  4. {  
  5. public:  
  6.      explicit A(int a)  
  7.     {  
  8.         cout<<"建立類成功了!"<<endl;  
  9.     }  
  10. };  
  11. int main()  
  12. {  
  13.     A a=10;  
  14.     return 0;  
  15. }  

上面的程式碼編譯不成功,原因是當顯式地定義了一個帶一個引數的建構函式( 帶explicit),必須要顯示地呼叫建構函式,

A a(10);

如果不加 explicit的話

A a=10;

實際的轉換過程如下:
相當於直接呼叫A(10);

(1)

explicit

此關鍵字只能對使用者自己定義的物件起作用,不對預設建構函式起作用
此關鍵字只能夠修飾建構函式。而且建構函式的引數只能有一個。。

(2)何時用explicit

當我們不希望自動型別轉換的時候用,其實標準庫好多建構函式都是explicit的

比如說vector <int> ivec(10);  //這種定義看起來一目瞭然

不能寫成vector <int> ivec=10;//此種定義讓程式設計師感到疑惑

(3)何時不用explicit

當我們需要隱式轉換的時候

比如說String類的一個建構函式

String(const char*);

定義成這樣的好處,在需要隱式轉化的時候編譯器會自動地幫我們轉換,標準庫裡面的String就是一個好的證明。

具體來說:

我們可以這樣String str="helloworld";//直接呼叫建構函式

String str="hello"+str+"world";

呼叫過載的+操作符號,此過程相當於:
String temp("hello"); //呼叫建構函式

String str=temp+str;

String t("world");//呼叫建構函式

String str=str+t;

明白隱式轉換在我們自己寫類的時候,尤其是些操縱記憶體的類的時候很有用。

相關推薦

C++ explicit用法

explicit 是避免建構函式的引數自動轉換為類物件的識別符號 #include <iostream> using namespace std; class A { public: explicit A(int a) { cout<<

C+explicit用法

explicit 是避免建構函式的引數自動轉換為類物件的識別符號 [cpp] view plaincopyprint? #include <iostream>   using namespace  std;  class A  {  public:  

C++explicit用法【轉】

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

c/c++const用法總結

沒有 pan 分配 值類型 變量初始化 _id 多少 部分 參數 1、修飾常量時:   const int temp1; //temp1為常量,不可變   int const temp2; //temp2為常量,不可變 2、修飾指針時:   主要看const在*的前後,

c++ explicit 的作用

pre test 一個 調用 顯示 bsp 我們 spa pan 在c++中,只傳一個參數的構造函數定義了一個缺省的轉換操作(隱式轉換),即將該構造函數對應數據類型的數據轉換為該類的對象,如下所示 class A { public: A(int a); } A

C#Split用法~字符串分隔

rec get 字符 說明 logs sep bbs options tle 1、用字符串分隔: using System.Text.RegularExpressions;string str="aaajsbbbjsccc";string[] sArray=

C#const用法詳解

htm 鏈接 服務器 span img body 用法詳解 -s 設計 本文實例講述了C#中const用法。分享給大家供大家參考。具體用法分析如下: const是一個c語言的關鍵字,它限定一個變量不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性,另外,

C#FormsAuthentication用法實例

clear tick brush esp void 轉載 地址 功能 def using System; using System.Web; using System.Web.Security; namespace AuthTest { public class Aut

C#protected用法詳解

base 而是 報錯 public 我們 此刻 訪問 .html 定義 轉自(https://www.cnblogs.com/wangyt223/archive/2012/08/08/2627801.html) 在c#的可訪問性級別中,public和private算是最

C Format用法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++STL用法總結【轉】

(轉自:https://blog.csdn.net/piaoxuezhong/article/details/54348787?utm_source=blogxgwz8) 1.1 什麼是STL? STL(Standard Template Library),即標準模板庫,是一個具有工業強度的

C++memset()用法

memset()函式原型是extern void *memset(void *buffer, int c, int count) buffer:為指標或是陣列 c:是賦給buffer的值 count:是buffer的長度 1. memset是以位元組為單位,初始化記憶體塊。 當初

C++CONST用法總結

1、修飾常量時: ? 1 2 const int temp1; //temp1為常量,不可變 int const temp2; //temp2為常量,不可變 2、修飾指標時:   主要看const在*的前後,

C# ??,:,?:的用法

private void button1_Click(object sender, EventArgs e) { int a = 0; object flag = null; Boolean t = true; Boolean temp = f

C++explicit關鍵字的作用

explicit用來防止由建構函式定義的隱式轉換。   要明白它的作用,首先要了解隱式轉換:可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的一個隱式轉換。 例如:  

c++set用法

1.關於set C++ STL 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了連結串列,map

C#Enum用法小結

列舉   列舉型別宣告為一組相關的符號常數定義了一個型別名稱。列舉用於“多項選擇”場合,就是程式執行時從編譯時已經設定的固定數目的“選擇”中做出決定。   列舉型別(也稱為列舉)為定義一組可以賦給變數的命名整數常量提供了一種有效的方法。例如,假設您必須定義一個變數,該變數的值表示一週中的一天

C++set用法詳解

1.關於set C++ STL 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了連結串列,map和se

C++STL用法總結

函式庫對資料型別的選擇對其可重用性起著至關重要的作用。舉例來說,一個求方根的函式,在使用浮點數作為其引數型別的情況下的可重用性肯定比使用整型作為它的引數類性要高。而C++通過模板的機制允許推遲對某些型別的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了相當多的有用演算法。它是在一

C#MessageBox用法大全(附效果圖)

我們在程式中經常會用到MessageBox。    MessageBox.Show()共有21中過載方法。現將其常見用法總結如下:    1.MessageBox.Show("Hello~~~~"); 最簡單的,只顯示提示資訊。 2.MessageBox.Show("