1. 程式人生 > >C++ explicit關鍵字應用於建構函式

C++ explicit關鍵字應用於建構函式

  • C++ explicit關鍵字主要是用來對建構函式進行修飾,來表明這一建構函式是顯示的。那麼在這裡大家就一起來看看其正確的使用方法吧。

C++ 程式語言可以被看做是C語言的一個升級版本,其中有很多應用方式與C語言相似,但同時又比C語言功能更加強大,應用方式更加靈活。在這裡我們就可以先從C++ explicit關鍵字的應用方式來具體分析一下這一語言的應用方法。

C++ explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有"顯式"那麼必然就有"隱式",那麼什麼是顯示而什麼又是隱式的呢?

如果C++類的建構函式有一個引數,那麼在編譯的時候就會有一個預設的轉換操作:將該建構函式對應資料型別的資料轉換為該類物件,如下面所示:

  1. class MyClass  
  2. {  
  3. public:  
  4. MyClass( int num );  
  5. }  
  6. ....  
  7. MyClass  obj  =  10 ; //ok,convert int to MyClass 

在上面的程式碼中編譯器自動將整型轉換為MyClass類物件,實際上等同於下面的操作:

  1. MyClass temp(10);  
  2. MyClass  obj  =  temp

上面的所有的操作即是所謂的"隱式轉換"。

如果要避免這種自動轉換的功能,我們該怎麼做呢?嘿嘿這就是關鍵字explicit的作用了,將類的建構函式宣告為"顯示",也就是在宣告建構函式的

時候前面新增上C++ explicit關鍵字即可,這樣就可以防止這種自動的轉換操作,如果我們修改上面的MyClass類的建構函式為顯示的,那麼下面的程式碼就不能夠

編譯通過了,如下所示:

  1. class MyClass  
  2. {  
  3. public:  
  4. explicit MyClass( int num );  
  5. }  
  6. ....  
  7. MyClass  obj  =  10 ; //err,can't non-explict convert

相關推薦

C++ explicit關鍵字應用建構函式

C++ explicit關鍵字主要是用來對建構函式進行修飾,來表明這一建構函式是顯示的。那麼在這裡大家就一起來看看其正確的使用方法吧。 C++ 程式語言可以被看做是C語言的一個升級版本,其中有很多應用方式與C語言相似,但同時又比C語言功能更加強大,應用方式更加靈活。在這

C++ explicit關鍵字詳解(用於建構函式

C++ explicit關鍵字詳解(用於建構函式) C++提供了關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。宣告為explicit的建構函式不能在隱式轉換中使用。 C++中,一個引數的建構函式(或者除了第一個引數外其餘引數都有預設值的多參建構函式),

C++ explicit關鍵字 詳解(用於建構函式

在C++程式中很少有人去使用explicit關鍵字,不可否認,在平時的實踐中確實很少能用的上。再說C++的功能強大,往往一個問題可以利用好幾種C++特性去解決。但稍微留心一下就會發現現有的MFC庫或者C++標準庫中的相關類宣告中explicit出現的頻率是很高的。瞭解e

C++隱式型別轉換建構函式關鍵字explicit

轉自公眾號:碼農有道1. 隱式型別轉換建構函式:    在《C++ Primer》這本經典教程中提到:可以用單個實參來呼叫的建構函式定義從形參型別到該類型別的一個隱式轉換。這句話看起來比較繞口挺不好理解的。我們還是結合例項來理解。#include <iostream&g

1、【C++】類&物件/建構函式/拷貝建構函式/操作符過載/解構函式

一、C++類 & 物件     C++ 在 C 語言的基礎上增加了面向物件程式設計,C++ 支援面向物件程式設計。類是 C++ 的核心特性,通常被稱為使用者定義的型別。     類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在

C++ 簡單複數類拷貝建構函式

總時間限制:  1000ms   記憶體限制:  65536kB // 在此處補充你的程式碼 描述 下面程式的輸出是: 3+4i  5+6i 請補足Complex類的成員函式。不能加成員變數。 #include <

C++11之前和C++11之後的 vector 建構函式的區別

例子: #include <iostream> #include <vector> using namespace std; class A { public: A(const char* s = "1234") { cout << "ASDF"

犯的迷糊1(C++ friend友元 & 建構函式

  今天算是犯糊塗了,在初始化一個類物件時,我竟然認為是簡單的直接賦值。如下例子中的A():btest(this),a(88),這個地方當時認為是直接將A物件this指標賦值給btest物件(當時不知道怎麼了,btest也不是指標型別啊)。後來以為是A類繼承了B類,但是也不是啊。又過了一

C++編譯器生成預設的建構函式的幾種情況

問題:對c++初學者來說存在一個誤區,如果類沒有定義任何建構函式,編譯器會自動生成預設的建構函式。   注意:這種說法是錯誤的。 正確的說法:惟有預設建構函式”被需要“的時候編譯器才會合成預設建構函式。 那什麼情況下是“被需要”

C++_派生類的建構函式及派生類和基類之間的特殊關係

派生類和基類的概念及派生類建構函式的原理: 建立一個叫做TableTennisPlayer的基類,記錄會員的名字和是否有球桌。 1 //宣告一個基類 2 class TableTennisPlayer 3 { 4 private: 5 string firstname; 6

C++ explicit關鍵字詳解

首先, C++中的explicit關鍵字只能用於修飾只有一個引數的類建構函式, 它的作用是表明該建構函式是顯示的, 而非隱式的, 跟它相對應的另一個關鍵字是implicit, 意思是隱藏的,類建構函式預設情況下即宣告為implicit(隱式). 那麼顯示宣告的建構函式和隱式

C++中派生類的建構函式

型別轉換 公有派生類物件可以被當做基類的物件使用,反之則不可。 派生類的物件可以隱含轉換為基類物件; 派生類的物件可以初始化基類的引用; 派生類的指標可以

淺談C++中的幾種建構函式

3月中旬參加宣講會,做了X軟公司的C++筆試題,裡面有一道“預設拷貝建構函式的題”,由於好久沒複習C++基礎知識,當時連基本的概念都想不來了了。於是乎,開始拿起以前看的譚浩強C++複習起來,現在書快要要啃完了,覺得收穫頗多。好比練武功,祕籍雖然重要,但更重要的還

C++中class類 的 建構函式、解構函式

說明: demo.cpp:main.cpp所在之處 Line.h:線段類的.h檔案 Line.cpp:線段類的.cpp檔案 Coordinate.h:座標類的.h檔案 Coordinate.cpp:

C++呼叫父類的建構函式規則

構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。 如果沒有顯式的建構函式,編譯器會給一個預設的建構函式,並且該預設的建構函式僅僅在沒

C++編譯器自動生成拷貝建構函式的情況

編譯器在下面幾種情況下會給程式設計師沒有提供拷貝建構函式的類自動生成拷貝建構函式 1.類中有虛擬函式 當這個類中有虛擬函式的時候,意味著這個類的物件中一定包含了指向其虛擬函式表的指標 試想,如果講該類的派生類的物件作為該類的初始化物件,即 B繼承A class A { p

C++結構體:預設建構函式,複製建構函式,過載=運算子

C++結構體提供了比C結構體更多的功能,如預設建構函式,複製建構函式,運算子過載,這些功能使得結構體物件能夠方便的傳值。 比如,我定義一個簡單的結構體,然後將其作為vector元素型別,要使用的話,就需要實現上述三個函式,否則就只能用指標了。 #include

c++實現String類(建構函式,解構函式,複製建構函式,各類運算子過載函式的編寫)

編寫類 String 的建構函式,解構函式,複製建構函式  需要過載下面的運算子: 1、<、>、==和!=比較運算子 2、+=連線運算子和賦值運算子 3、<<輸出運算子和>>輸入運算子 String.h #ifndef _STRING

C++中的顯式建構函式

    有如下一個簡單的複數類: class ClxComplex{public:    ClxComplex(double dReal =0.0, double dImage =0.0) { m_dReal = dReal; dImage = dImage; }    d

C++ explicit關鍵字:禁止隱式轉換

explicit關鍵字是用來防止由建構函式定義的隱式轉換。 要明白這個關鍵字的含義,首先我們要知道class型別的物件的隱式轉換:可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的一個隱式轉換。 比如: class SomeBody{ public: So