1. 程式人生 > >C++: explicit的適用場合以及為什麼要使用explicit

C++: explicit的適用場合以及為什麼要使用explicit

explicit是個C++關鍵子,但是關注過它的人遠遠沒有其他關鍵字的多,但是往往忽略了它,就會在一些不經意的地方造成錯誤,而花費更多的時間去尋找.

看下下面這個例子:

#include <iostream>
using namespace std;

class A
{
public:
    A(int i = 5)
    {
        m_a = i;
     }
private:
    int m_a;
};

int main()
{
    A s;
    //我們會發現,我們沒有過載'='運算子,但是去可以把內建的int型別賦值給了物件A.
    s = 10
; //實際上,10被隱式轉換成了下面的形式,所以才能這樣. //s = A temp(10); system("pause"); return 0; }

我們發現成員變數的值被修改了.
這裡寫圖片描述

由此可知:當類建構函式的引數只有一個的時候,或者所有引數都有預設值的情況下,類A的物件時可以直接被對應的內建型別隱式轉換後去賦值的,這樣會造成錯誤,所以接下來會體現出explicit這個關鍵詞的作用.

#include <iostream>
using namespace std;

class A
{
public:
    //這裡用explicit關鍵詞來修飾類建構函式.
explicit A(int i = 5, int j = 10) { m_a = i; m_b = j; } private: int m_a; int m_b; }; int main() { A s; //這樣直接賦值,會被提示錯誤,因為explicit抑制隱式轉換的進行 s = 10;//這樣會報錯!!! //當然顯示轉換還是可以的. s = A(20); system("pause"); return 0; }

通過兩個例子我們知道:explicit可以抑制內建型別隱式轉換,所以在類的建構函式中,最好儘可能多用explicit關鍵字,防止不必要的隱式轉換.

相關推薦

C++: explicit適用場合以及為什麼使用explicit

explicit是個C++關鍵子,但是關注過它的人遠遠沒有其他關鍵字的多,但是往往忽略了它,就會在一些不經意的地方造成錯誤,而花費更多的時間去尋找. 看下下面這個例子: #include <iostream> using namespace

C++標頭檔案用還是“” 以及 加.h還是不加 的問題

1.C++標頭檔案用<>包含還是” “? 答:用<>包含,編譯器會先在系統目錄下搜尋; 用” ” 包含,編譯器會先在使用者目錄下搜尋。 所以,如果使用系統標準庫,要使用<>來包含標頭檔案;使用自定義標頭檔案用” “包含最好。 ** 否則有時候會找不

c++關鍵字詳解(volatile, mutable, explicit, dynamic_ cast(expression))等(轉)

版權宣告:轉載時請以超連結形式標明文章原始出處和作者資訊及本宣告 http://cyinger-smiling.blogbus.com/logs/31041587.html c++關鍵字詳解(volatile, mutable, explicit, dynamic_ c

C#中的轉換關鍵字:explicit、implicit與operator

這個3個關鍵字貌似不是很常用。C#語法跟Java很接近,但是在Java裡面也沒有這些關鍵字。我在網上搜羅了一些資料,希望能夠幫助我們更好的理解這些關鍵字。 首先,explicit和implicit關鍵字分別表示顯式的型別轉換和隱式的型別轉換。 explicit 和 imp

c#配置問題以及簡單防止sql註入,連接池問題,sqldatareader對象對於connection對象的釋放

c#添加引用。system configurationconfigurationManager.AppSettings[“”]<appSetings><add key=“” value=“”></appSetings><connectionStrings><

C++臨時對象以及針對其進行的優化

隱式類型 例子 臨時 http 出現 nbsp ace uid hub C++臨時對象以及針對其進行的優化 C++中真正的臨時對象是看不見的,它們不出現在你的源代碼中。 那麽什麽時候回產生臨時對象呢?主要是三個時刻: 產生臨時對象的三個時刻: 用構造函數作為隱式類型轉換函數

Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好處以及註意的地方

內存 col 重復 代碼 初始 new list com empty 轉自https://www.cnblogs.com/qiumingcheng/p/7126281.html 先說明一下好處有哪些:1,如果你想 new 一個空的 List ,而這個 List 以後也不會再

C#串口介紹以及簡單串口通信程序設計實現

串口應用 HR receive 初始 ext edev 實現 ear 方式 C#串口介紹以及簡單串口通信程序設計實現 周末,沒事幹,寫個簡單的串口通信工具,也算是本周末曾來過,廢話不多,直接到主題 串口介紹   串行接口簡稱串口,也稱串行通信接口或串行通訊接口(通常指COM

mongodb在C#的連接以及curd寫法

AD new 查詢 條件 date collect 連接數 tps setting 連接數據庫:參考地址:https://blog.oz-code.com/how-to-mongodb-in-c-part-2/ // Empty ctor will get

c++右值引用以及使用

什麽 函數的參數 .html 顯式 pan 但是 cout 表達式 信息 前幾天看了一篇文章《4行代碼看看右值引用》 覺得寫得不錯,但是覺得右值引用的內容還有很多可以去挖掘學習,所以總結了一下,希望能對右值引用有一個更加深層次的認識 一、幾個基本概念 1.1左值和右值 左值

C#啟動外部程序以及等待外部程序關閉的幾種方法

string C# main 無限 完成 nbsp text enable geb 1. 啟動外部程序,不等待其退出。 2. 啟動外部程序,等待其退出。 3. 啟動外部程序,無限等待其退出。 4. 啟動外部程序,通過事件監視其退出。 // using Sy

python語言中多繼承中super調用所有父類的方法以及用到的MRO順序

and tle 發生 姓名 pytho comm 報錯 不定長參數 param   在python多繼承中,利用super().父類方法,可以調用所有父類,從而在重寫的狀態下,再次對所有父類的調用! 例: print("******多繼承使用super().__init__

c++ 堆和棧以及區別

一個地方 靜態 數據 也有 程序員 first .cn 特點 strcpy c++中內存分成5個區:堆、棧、自由存儲區、全局\靜態存儲區、常量存儲區 棧是一種連續存儲的數據結構,具有先進後出的性質。堆是一種非連續的樹形存儲數據結構,每個節點有一個值,整棵樹是經過排序的,特點

C#環境搭建,以及C#編譯器的使用

load www 包管理 download 5.0 mpi share color 環境 搭建nuget包管理器 HomePage windows環境下,可以下載安裝包:Download 使用最新版本的C#編譯器 C# 5.0之後,微軟將csc開源並獨立運行,其項目命名為—

C/C++開發】C++ 解構函式以及 delete 和delete[]的整理

轉自:http://hi.baidu.com/bystander1983/item/bf0b5c12b077cfec9913d651 delete和delete[] 的區別: C++告訴我們在回收用 new 分配的單個物件的記憶體空間的時候用 delete,回收用 new[] 分配的一組物

C++虛擬函式表以及記憶體對齊文章

C++虛擬函式表以及記憶體對齊文章 C++ 物件的記憶體佈局(上) https://blog.csdn.net/haoel/article/details/3081328 C++ 物件的記憶體佈局(下) https://blog.csdn.net/haoel/article/deta

【轉載】c++右值引用以及使用

轉自:https://www.cnblogs.com/likaiming/p/9045642.html 前幾天看了一篇文章《4行程式碼看看右值引用》 覺得寫得不錯,但是覺得右值引用的內容還有很多可以去挖掘學習,所以總結了一下,希望能對右值引用有一個更加深層次的認識 一、幾個基本概念 1.

C#文字轉語音以及語音閱讀小例項

轉載自:猿哥愛碼 c#實現語音閱讀以及文字轉語音檔案是基於c#的一個類庫(SpeechSynthesizer )實現的, 使用該類必須要新增引用using System.Speech.Synthesis;直接是無法新增引用的, 先對專案進行新增應用 示例圖 using System;

Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好處以及注意的地方

https://blog.csdn.net/qq_27093465/article/details/65444622 先說明一下好處有哪些: 1,如果你想 new 一個空的 List ,而這個 List 以後也不會再新增元素(有大坑,看下面更新), 那麼就用 Collections.empt

C++中抽象類以及虛/純虛、解構函式的區別與介紹

一、虛擬函式 在某基類中宣告為 virtual 並在一個或多個派生類中被重新定義的成員函式,用法格式為:virtual+函式返回型別+ 函式名(引數表) {函式體};實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。 二、純虛擬函式 純虛擬函式是一種