簡體   English   中英

定義的副本構造函數c ++的默認行為

[英]default behaviour of defined copy constructor c++

假設我為類B定義了一個復制c'tor,它繼承了A並且還具有成員變量。 在copt c'tor主體內部,我編寫了一些代碼,但是在初始化列表中,我沒有顯式調用A c'tor(也不是復制c'tor),也沒有初始化成員變量。

在這種情況下,默認的c'tor將在到達B'復制c'tor主體之前被默認調用。 但是成員變量會是什么呢? 他們會使用其默認c'tor或帶有爭論對象成員的副本c'tor(參數對象==給予B復制c'tor)進行初始化。

另外,如果在初始化列表中調用了某些成員的副本c'tor / c'tor或父類副本c'tor / c'tor,該行為是否會改變?

我知道,萬一我們沒有明確定義復制c'tor的話,就會調用父類和復制c'tor的成員。

我在這里應該期待什么?

在這種情況下,將默認初始化基類的子對象。 參見[class.base.init] / 8:

在非委托的構造函數中,如果給定的可能構造的子對象未由mem-initializer-id指定(包括由於構造函數沒有ctor-initializer而沒有mem-initializer-list的情況),則

  • 如果實體是具有大括號或相等初始化程序 [..]的非靜態數據成員,則
  • 否則,如果實體是匿名聯合或變量成員(9.5),則不執行初始化;
  • 否則,該實體為默認初始化(8.5)。

在[special] / 5中定義了一個可能構造的子對象:

對於一個類,其非靜態數據成員, 其非虛擬直接基類 ,以及如果該類不是抽象(10.4),則其虛擬基類稱為其潛在構造的子對象。

如果您編寫一個復制構造函數並且不初始化成員變量,那么它將被默認初始化。

這同樣適用於基類,在大多數情況下,它們與成員變量相同。

這是一些示例代碼,將演示:

#include <iostream>

using namespace std;

struct S
{
    S() { cout << "S()\n"; }
    S(S const &) { cout << "S(S&)\n"; }
};

struct T : S
{
    T() {}
    T(T const &t) {}

    // you have to explicitly write this if you want it 
    // T(T const &t): S(t) {}
    //                ^^^^
};

int main()
{
    T t;
    T u(t);
}

暫無
暫無

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

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