[英]Copy constructor called everytime a default constructor is called?
碰到這個問題時,我正在研究有關構造函數初始化列表的一些問題。
考慮一下:
class Student {
public:
Student() {
id = 0;
}
Student(int i) {
id = i;
}
private:
int id;
};
現在,檢查一下:
當您進入構造函數的主體時,所有字段都已被構造; 如果它們具有默認構造函數,則這些構造函數已被調用。 現在,如果您在構造函數的主體中為其分配值,則您正在調用復制構造函數。 這是低效的,因為最終調用了兩個構造函數而不是一個。
那么,這是否意味着當我調用無參數構造函數時,也會同時調用復制構造函數?
請解釋。 這真是令人困惑。
特別是第一行的含義:
當您進入構造函數的主體時,所有字段都已經被構造
這意味着int id
在到達id = 0
之前已經被初始化。 由於未指定任何顯式初始化程序,因此已默認初始化。 另外,因為它是一個int
,所以初始化規則告訴使用它將具有一些不確定的值。
在實踐中,對於int
或任何初始化起來非常便宜的類型,這沒什么大不了的。
如果我們使用類而不是使用int
成員,則可以更清楚地了解幕后的實際情況:
#include <iostream>
class Verbose {
public:
Verbose() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
Verbose(int) {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
Verbose(Verbose const &) {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
Verbose & operator=(Verbose const &) {
std::cout << __PRETTY_FUNCTION__ << "\n";
return *this;
}
~Verbose() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
};
class Object {
public:
Verbose v;
Object() {
v = Verbose(3);
}
};
int main() {
Object o;
}
此代碼將輸出:
Verbose::Verbose()
Verbose::Verbose(int)
Verbose &Verbose::operator=(const Verbose &)
Verbose::~Verbose()
Verbose::~Verbose()
請注意,我們:
v
。 Verbose(3)
Object o
超出范圍時,我們然后銷毀成員變量。 請注意,我們基本上構造了兩次Verbose v
! 我們首先使用默認的構造函數,然后基本上使用operator=
調用對其進行重建。 如果使用初始化列表 ,則可以將其減少為對Verbose(int)
一次調用。
他們的意思是
Student() {
id = 0;
}
效率不如
Student() : id(0) {}
在此特定示例中,由於成員只是一個int
,因此將在單個步驟中初始化id
。
相反,如果Student
具有更多復雜的成員(例如Backpack
和Books
,則后一種方法將有所作為。 如果這些類不是POD,則第一個方法將花費兩步來初始化成員,而第二個方法將只花費一個步來初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.