簡體   English   中英

為什么復制構造函數調用其他類的默認構造函數?

[英]Why does copy constructor call other class' default constructor?

我想知道為什么會發生這樣的錯誤。

no matching function for call to 'Foo::Foo()'

在代碼中的復制構造函數? 假設Foo只是具有普通字段的對象(沒有動態分配的內存等),並且它定義的唯一構造函數是采用一個參數的構造函數。

我什至不知道需要考慮構造函數。 如果代碼顯示類似

bar = thing.bar; //

並且bar是Foo類型,具有上述規格,難道它不只是生成一個淺表副本並用它完成嗎? 為什么需要調用默認構造函數?

如果未定義構造函數,則編譯器將生成默認構造函數,但是,如果您確實定義了構造函數(如副本構造函數),則編譯器將不會生成默認構造函數,因此您也需要定義該構造函數。

聽起來您已經定義了復制構造函數而未定義任何其他構造函數。

明確聲明構造函數后,編譯器將不再為您提供默認的構造函數。 因此,首先您將不再具有構造該類的對象的機制(因此將無法復制該對象)。

如您所說,如果您正在做“

bar = thing.bar;

它大概位於類的副本ctor的主體中-因此,首先使用其類的默認ctor初始化bar字段,然后將該類的賦值運算符用於此語句。 如果bar的類僅具有復制ctor,沒有默認ctor,則需要類的復制ctor開頭{ 之前添加bar(thing.bar)子句, 然后刪除該賦值(無論如何通常是一個好主意,但在“沒有默認ctor”條件)。

暫無
暫無

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

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