[英]Why does passing by reference involve a copy constructor?
在Deitel C ++的書(“C ++ 11 for Programmers”,第286頁)中,有一個例子:
class Date { ... }
class Employee {
public:
Employee(const string &, const string &, const Date &, const Date &);
private:
string firstName;
string lastName;
const Date birthDate;
const Date hireDate;
}
Employee::Employee( const string &first, const string &last,
const Date &dateOfBirth, const Data &dateOfHire)
: firstName( first),
lastName( last),
birthDate(dateOfBirth),
hireDate(dateOfHire) { };
書中說成員初始化程序如birthDate(dateOfBirth)
調用了Date
類的復制構造函數。 我很困惑為什么復制構造函數? 我認為“通過引用傳遞”的全部要點是避免對象復制?
如果我做:
Date birth(7,24, 1959);
Date hire(2,12, 1988);
Employer staff("bob", "blue", birth, hire);
系統現在有多少Date對象,2或4? (兩個在開始時創建,兩個由復制構造函數創建)
它不是涉及副本的傳遞模式。
這是調用副本的成員的初始化(顯然?參數不在類中,並且類成員需要獲得相同的值:copy)
我們來看看
Employee::Employee( const string &first, const string &last,
const Date &dateOfBirth, const Data &dateOfHire)
: firstName( first),
lastName( last),
birthDate(dateOfBirth),
hireDate(dateOfHire) { };
//
int main()
{
const std::string fname = "test";
Employee e(fname, /* ..... */);
}
Employee::Employee
,通過const&
傳遞fname
( 無副本 )。 std::string(const std::string&)
,再次通過const&
傳遞參數(仍然沒有副本)。 std::string
復制構造函數現在采取所有必要步驟將其參數的值復制到對象本身。 這是副本 有意義的是,當你構造一個新的std::string
(在這種情況下作為Employee的成員)時,它會產生一個...... new std::string
。 我認為,以這種方式思考這一點很容易掌握。
您的原始對象birth
確實是通過引用Employee
復制構造函數傳遞的,因此不會在該階段進行復制。 然而,當Employee
拷貝被constructred, 會員 Employee::birthDate
對象是使用它自己的拷貝構造函數,到外初始化birth
的對象是按引用傳遞,但當然是拷貝構造函數將使副本birth
object,它成為Employee::birthDate
成員對象。
這兩行將調用Date的復制構造函數:
birthDate(dateOfBirth),
hireDate(dateOfHire)
“通過引用傳遞”的意思是在調用Employee構造函數時不立即復制,但僅當您選擇在傳遞Date時初始化Employee的成員之一時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.