簡體   English   中英

C ++中的Default與Implicit構造函數

[英]Default vs. Implicit constructor in C++

這非常簡單,但捷克語(我的母語)不區分隱式和默認,所以我對一些捷克語翻譯感到困惑,隱式和默認構造函數或構造函數調用之間的區別是什么。

struct Test {
  Test(int n=0) { }
};

你能用這些術語描述什么是:

  1. 測試t1;
  2. 測試t2();
  3. 試驗t3 = 3;
  4. 試驗t4(4);
  5. 試驗t5 =試驗(5);

在討論構造函數時,術語defaultimplicit具有以下含義:

  • default constructor是一個可以不帶參數調用的構造函數。 它不需要參數,也不會為每個參數設置默認值。

  • 隱式構造函數是一個常用於談論語言中兩個不同概念的術語

    • 隱式聲明構造函數 ,它是默認或復制構造函數,如果未提供用戶定義的構造函數(默認)或未提供復制構造函數(復制),將為所有用戶類聲明。 也就是說,沒有用戶聲明的構造函數的類有一個隱式聲明的默認構造函數

    • 隱式地定義的構造是一個隱式聲明的構造 ,其用於(ODR使用的語言中的1和用於該編譯器將提供的定義。

     struct test { test(int i = 0) { } // test(test const&) implicitly declared here }; struct test2 { }; // implicitly declared: test2(), test2(test2 const&) int main() { test t; test copy(t); // causes *definition* of the implicitly // declared copy constructor test2 t2; // causes *definition* of test2::test2() test2 copy2(t2); // causes *definition* of test2::test2(test2 const&) } 

簡單來說,如果構造函數可以在沒有參數的情況下調用,則它是默認的 如果構造函數不是由用戶提供但是聲明/定義,則構造函數是隱式的(聲明/定義)

截至具體案例:

Test t1;

使用默認構造函數Test(int = 0) ,它不是隱式的。

Test t2();

這是一種奇怪的語言怪癖,它聲明了一個不帶參數的函數並返回一個Test對象。

Test t3 = 3;

這稱為復制初始化 ,相當於從3Test的隱式*轉換的組合以及從轉換結果復制t3構造。 這將使用Test(int)構造函數進行轉換,然后使用隱式定義 (和聲明的 )復制構造函數。 注意:編譯器可以優化復制,但必須驗證復制構造函數是否可用(訪問說明符)並且可以定義。

Test t4(4);

使用Test(int)構造函數,在這種情況下,它不作為默認構造函數。

Test t5 = Test(5);

相當於Test t3 = 3情況,唯一的區別是在這種情況下從5Test的轉換是明確的。 在這個例子中它沒關系,但是如果構造函數被標記為explicit該行將在t3情況失敗時進行編譯。


*) 隱式的另一種用法,在這種情況下指的是在代碼中沒有明確請求從3Test的轉換這一事實。 將其與t5進行比較,其中程序員明確請求轉換: Test(5)

你好像混淆了一些條款。 默認構造函數是不帶參數的構造函數, 隱式調用是直接調用構造函數的時候。

無論如何:

1)測試t1;

默認構造函數。

2)測試t2();

功能聲明。

3)測試t3 = 3;

復制初始化。 將調用轉換構造函數,從3創建臨時Test ,並使用復制構造函數創建t3

4)測試t4(4);

直接初始化。 直接使用轉換構造函數。

5)試驗t5 =試驗(5);

復制初始化。 與3)相似。

暫無
暫無

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

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