[英]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.