簡介
建構函式的確能使你的類變的簡單優雅,它也是乙個基本的函式,可以由編譯器以預設的方式提供給你,即預設建構函式。在c++中,如果你只寫一行**。
class a{};
編譯器會提供給你乙個預設的、無引數的建構函式,並伴隨乙個析構函式,乙個拷貝建構函式(copy constructor),乙個拷貝複製操作符(copy assignment operator)
背景
那麼什麼是顯式建構函式?
為了方便理解顯式建構函式,我們首先需要理解隱式轉換,讓我們看一下它在**中的作用,以及什麼時候不需要這些特性。
使用以下**,例1:思考下面這個傳統而簡單的複數類:
#include
using std::cout;
using std::endl;
class complexnumbers
complexnumbers(const complexnumbers& c)
complexnumbers( double r, double i = 0.0)
friend
void display(complexnumbers cx);
};void display(complexnumbers cx)
int main()
這個複數類很簡單,它包括實數複數兩部分,**定義了乙個預設的建構函式,乙個拷貝建構函式,以及著重定義了另乙個建構函式,用它來幫我們做一些隱式的構造。
在main函式中,我們首先建立了乙個名為one 和乙個名為 five的物件,由於隱式轉換的作用,它們都能成功呼叫。故物件one的實數為1,虛數為 0;物件five的實數為5,虛數0.我們可以使用複數類中的 「display」方法列印出來,對隱式轉換的理解,這是乙個很好的例子。輸出結果如下:
real part: 1 imag part: 0
real part: 5 imag part: 0
下面我們考慮這個例子:
#include
using std::cout;
using std::endl;
class complexnumbers
complexnumbers(const complexnumbers& c)
complexnumbers( double r, double i = 0.0)
friend
void display(complexnumbers cx);
};void display(complexnumbers cx)
int main()
類似的例子,只是在main方法中多加了一行,display(300),繼續,輸出結果變為:
real part: 1 imag part: 0
real part: 300 imag part: 0
「邦」!!!這不是我們希望的結果,首先**本身就不清楚,display(300)什麼意思?display 方法的引數期待的是複數類的乙個物件/例項,而300根本不是,那麼這種情況是如何發生的呢?
因為display方法期待乙個複數類的乙個物件/例項,當我們把300這個十進位制數傳進去是,在將300這個十進位制數傳到複數類的乙個臨時物件時,發生了一次隱式轉換。(因此,300就賦值給臨時物件的實數了)。
那麼怎麼解決這種情況呢??
很簡單,強制編譯器只能通過顯示構造來建立物件,技巧如下:
#include
using std::cout;
using std::endl;
class complexnumbers
complexnumbers(const complexnumbers& c)
explicit complexnumbers( double r, double i = 0.0)
friend
void display(complexnumbers cx);
};void display(complexnumbers cx)
int main()
思考下面的語句:
explicit complexnumbers( double r, double i = 0.0)
此時我們強制編譯器在這段**中不能使用隱式轉換,如果程式設計師寫包含隱式轉換的**,編譯器將返回乙個錯誤。
bash-3.2$ g++ -g -o hello test2.cpp
test2.cpp: in function 『int main()』:
test2.cpp:22: error: conversion from 『int』 to non-scalar type 『complexnumbers』 requested
test2.cpp:23: error: conversion from 『int』 to non-scalar type 『complexnumbers』 requested
鑑於此,程式設計師應當用下面的方法實現:
display(complexnumbers(200)); //只允許顯示轉換…………
C 顯式建構函式
如果c 類的其中乙個建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件。如下面的例子 include using namespace std class b explicit b int data data data int main 在程式的...
C 中的顯式建構函式
以兩個c 的小例子來說明怎樣通過使用顯式建構函式來防止隱式轉換。class clxcomplex double getreal const double getimage const private double m dreal double m dimage 我們知道,下面的3行 是等價的 clx...
C 中的顯式建構函式
c 中的顯式建構函式 以兩個c 的小例子來說明怎樣通過使用顯式建構函式來防止隱式轉換。class clxcomplex double getreal const double getimage const private double m dreal double m dimage 我們知道,下面的...