淺談C++ Explicit Constructors(顯式構(gòu)造函數(shù))
C++ 為類(Class)提供了許多默認(rèn)函數(shù)。如果自己沒有申明,編譯器會(huì)為我們提供一個(gè)copy構(gòu)造函數(shù)、一個(gè)copy assignment操作符和一個(gè)析構(gòu)函數(shù)。此外,如果沒有申明任何構(gòu)造函數(shù),編譯器會(huì)為我們申明一個(gè)default構(gòu)造函數(shù)。很像下面的Empty類:
class Empty{
public:
Empty();
Empty(const Empty &rhs);
~Empty();
Empty& operator=(const Empty &rhs);
};
就像Effective C++說的,如果不想使用編譯器自動(dòng)生成的函數(shù),就應(yīng)該明確拒絕。
1.C++中的隱式構(gòu)造函數(shù)
如果c++類的其中一個(gè)構(gòu)造函數(shù)有一個(gè)參數(shù),那么在編譯的時(shí)候就會(huì)有一個(gè)缺省的轉(zhuǎn)換操作:將該構(gòu)造函數(shù)對(duì)應(yīng)數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換為該類對(duì)象。
2.Explicit Constructors顯式構(gòu)造函數(shù)
為了避免上面提到的只有一個(gè)參數(shù)的構(gòu)造函數(shù)采用的缺省轉(zhuǎn)換操作,在構(gòu)造函數(shù)前,使用Explicit 關(guān)鍵字修飾即可。
3.如下面的例子:
#include <iostream>
using namespace std;
class B{
public:
int data;
B(int _data):data(_data){}
//explicit B(int _data):data(_data){}
};
int main(){
B temp=5;
cout<<temp.data<<endl;
return 0;
}
程序第11行,將int轉(zhuǎn)換為B類型的對(duì)象,就是使用了隱式構(gòu)造函數(shù)。因?yàn)锽中存在一個(gè)只有一個(gè)參數(shù)的構(gòu)造函數(shù),且參數(shù)類型也是int。
如果在構(gòu)造函數(shù)前加explicit ,表示為顯示構(gòu)造函數(shù),則第11行編譯不能通過。因?yàn)檫@時(shí),就沒有隱式構(gòu)造函數(shù)啦。
以上這篇淺談C++ Explicit Constructors(顯式構(gòu)造函數(shù))就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
C語言用循環(huán)單鏈表實(shí)現(xiàn)約瑟夫環(huán)
這篇文章主要為大家詳細(xì)介紹了C語言用循環(huán)單鏈表實(shí)現(xiàn)約瑟夫環(huán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Qt實(shí)現(xiàn)高準(zhǔn)確率的語音識(shí)別
Vosk是一個(gè)開源的語音識(shí)別工具,支持中英文及多種語言,具備離線識(shí)別能力,且不依賴互聯(lián)網(wǎng),本文就來聊聊如何使用Vosk API在C++中進(jìn)行中英文識(shí)別吧2024-11-11
C語言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過程
這篇文章主要為大家介紹了C語言實(shí)現(xiàn)簡易通訊錄的完整流程,此通訊錄還可以增容,并且每個(gè)環(huán)節(jié)都有完整代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-05-05
C++實(shí)現(xiàn)棧的操作(push和pop)
這篇文章主要介紹了C++實(shí)現(xiàn)棧的操作(push和pop),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

