簡體   English   中英

在C ++中對構造函數使用默認參數的不同方法

[英]Different ways to use default argument to a constructor in C++

以下三段代碼相對於MSVC有何區別?

代碼1:Foo ctor定義為:

Foo::Foo(Bar &bar = Bar());

Foo ctor用作:

Foo foo = new Foo();

代碼2:Foo ctor定義為:

Foo::Foo()
{
    Bar bar = Bar();
    Foo(bar);
}

Foo::Foo(Bar &bar);

Foo ctor用作:

Foo foo = new foo();

代碼3:Foo ctor定義為:

Foo::Foo(Bar &bar);

Foo ctor用作:

Bar bar = Bar();
Foo foo = new foo(bar);

編輯:對代碼進行更正。 目的是解釋這個想法,而不是專注於代碼,因此犯了錯誤。 對於那個很抱歉。

具體來說,問題在於找出代碼2和3之間的區別。由於某些原因,在代碼2的情況下,Foo類ctor的使用者會導致崩潰,而在代碼3的情況下則不會。 我沒有使用者的特定代碼,所以我自己也無法弄清楚。

在前兩個中,您甚至沒有調用構造函數,而是在聲明一個函數:

Foo foo(); // function foo, returns a Foo object

要默認構造一個Foo ,您需要

Foo foo;   // C++11 and C++03
Foo foo{}; // C++11

您的大多數代碼都是非法的,或者沒有達到您的期望。 例如,此構造函數除了創建本地Bar變量bar和創建具有相同名稱的實例類型Foo ,不執行其他任何操作:

Foo::Foo()
{
    Bar bar = Bar(); // local variable bar
    Foo(bar);        // error: 'bar' has a previous declaration as 'Bar bar'
}

暫無
暫無

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

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