簡體   English   中英

使用默認構造函數進行顯式轉換

[英]Explicit casting using default constructor

我正在通過Scott Myers Effective C ++進行工作。 文本中顯示以下內容。

在此處輸入圖片說明

我很難理解有效語法語句doSomething(B(28));

對於doSomething() ,如何精確地使用B(28)創建類B的對象需要B bObject類型的參數B bObject

此外,假設class B的完整定義如下:

class B{
    int b;
public:
    explicit B(int x = 0, bool b = true);
}

另外,假設這樣定義了doSomething()

void doSomething(B bObject){
    bObject.b = 1;
}

doSomething(B(28)); ,如何訪問b成員? 即,成員變量b訪問哪個對象?

B是具有有效構造函數的類,該構造函數帶有int參數。 就是說,B在傳遞int時知道如何構造自己。

28是int的有效表示。

B(28)是一種使用帶有int的構造函數實例化“ B”類的方法。

為了進一步說明,“ B”的構造函數將采用int和bool,但兩個參數均為“可選”,對於int參數,這表示為“ = 0”,對於“ b”表示為“ = true”布爾參數。

由於參數是可選的,因此B可以在不指定參數的情況下進行構造,在這種情況下,它將使用x = 0和b = true進行構造。 如您的示例一樣,它也可以使用指定的int參數進行構造。 在您的示例情況下,x = 28,b = true。 也可以使用指定的兩個參數來構造它。 例如B(8,false)。 但是,不可能僅指定bool參數。 例如,B(false)將不起作用。 填寫可選參數時,無法跳過參數。 B(,false)無效...

因此,B(28)構造一個x = 28的B對象。

現在,函數DoSomething希望傳遞一個“ B”對象。 由於B(28)是'B'對象的有效構造,因此它滿足DoSomething的參數列表。

你打電話時:

DoSomething(B(28));

構造一個“ B”對象,並將其作為參數傳遞給DoSomething。

在函數內部,B被稱為“ bObject”,因為函數簽名:

DoSomething(B bObject)...

該函數簽名希望傳遞類型為“ B”的東西,並且在函數內部將其稱為bObject。

從而,

bObject.b = 1;

將值1分配給構造並傳遞給該函數的B類的'b'成員。

也許這有點令人困惑的原因是,在DoSomething完成設置B類的b成員並且函數退出之后,B類不再存在,因此在退出DoSomething函數之后無法證明b成員被修改。

據我所知,這樣做(將臨時對象傳遞給函數,然后對其進行修改,然后使其不再存在)是一件毫無用處的事情。

作者似乎真正想解釋的是構造函數中“顯式”的重要性。 該示例有助於闡明顯式構造函數,但不包括對參數或其他內容的隱式轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM