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+函式返回型別+ 函式名(引數表) {函式體};實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。 二、純虛擬函式 純虛擬函式是一種