C 顯式建構函式 翻譯

2021-04-19 18:51:06 字數 2542 閱讀 7663

簡介

建構函式的確能使你的類變的簡單優雅,它也是乙個基本的函式,可以由編譯器以預設的方式提供給你,即預設建構函式。在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 我們知道,下面的...