[英]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
實體:
A
級成員 在A
構造函數中作為參數接收的變量作為構造B
(通過調用其構造函數)的參數傳遞,該參數是A
類A
成員。 這里的名稱沒有歧義,構造函數的全部是:
this->B(B);
this
是class A
指針。 B()
是B
類型的構造函數。 B
是B
類的實例。 這會將參數分配給自身或參數給類成員還是做其他事情?
它會將參數分配給類成員。
構造之后的列表中的名稱(我不知道它的調用方式)是如何解決的?
這是初始化列表,雖然該示例可能導致混淆,但括號左側的id是類的成員,而括號內的id(或文字)只能是構造函數的參數之一:想到這一點,根本就沒有歧義。
這里的關鍵是這個列表必須初始化具有某些值的類成員,所以如果你想到的話
...: B(B)
在概念上等同於構造函數調用:
this->B(B)
......沒有歧義。
在第一種情況下,您的對象將被構建。 在第二個中,它將被構造(使用默認構造函數)並分配。
您可能不希望分配(可能未定義運算符,或者沒有默認構造函數或行為是特定的,或者在某些情況下可能是由於性能問題)。
關於可見性,在這兩種情況下,如果你只使用B,它就是你操縱的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.