簡體   English   中英

在構造函數中使用類成員名稱

[英]Using class member name in a constructor

我知道這個,因為這會將構造函數參數分配給類成員:

class A
{
    public:
        some_type B;
        A(some_type B)
        {
            this->B = B;
        }
}

但這會做什么:

class A
{
    public:
        some_type B;
        A(some_type B) : B(B)
        {
        }
}

這會將參數分配給自身或參數給類成員還是做其他事情?
構造之后的列表中的名稱(我不知道它的調用方式)是如何解決的?

Thing在C ++中稱為成員初始化列表

使用初始化程序列表(第2個示例)初始化成員並在構造函數體內為其賦值(第1個示例)之間存在差異。

通過初始化列表初始化字段時,構造函數將被調用一次。 使用傳遞的參數構造對象。

如果使用賦值,則首先使用默認構造函數初始化字段,然后使用實際值重新分配(通過賦值運算符 )。

如您所見,在后者中存在創建和分配的額外開銷,這對於用戶定義的類可能是相當大的。


構造之后的列表中的名稱(我不知道它的調用方式)是如何解決的?

public:
    some_type B;
    A(some_type B) : B(B)
    {
    }

在上面的snipet中,有兩個名為B實體:

  1. 首先是構造函數作為參數接收的那個&
  2. 第二是A級成員

A構造函數中作為參數接收的變量作為構造B (通過調用其構造函數)的參數傳遞,該參數是AA成員。 這里的名稱沒有歧義,構造函數的全部是:

this->B(B);
  1. thisclass A指針。
  2. B()B類型的構造函數。
  3. 括號內的BB類的實例。

這會將參數分配給自身或參數給類成員還是做其他事情?

它會將參數分配給類成員。

構造之后的列表中的名稱(我不知道它的調用方式)是如何解決的?

這是初始化列表,雖然該示例可能導致混淆,但括號左側的id是類的成員,而括號內的id(或文字)只能是構造函數的參數之一:想到這一點,根本就沒有歧義。

這里的關鍵是這個列表必須初始化具有某些值的類成員,所以如果你想到的話

...: B(B)

在概念上等同於構造函數調用:

this->B(B)

......沒有歧義。

在第一種情況下,您的對象將被構建。 在第二個中,它將被構造(使用默認構造函數)並分配。

您可能不希望分配(可能未定義運算符,或者沒有默認構造函數或行為是特定的,或者在某些情況下可能是由於性能問題)。

關於可見性,在這兩種情況下,如果你只使用B,它就是你操縱的參數。

暫無
暫無

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

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