簡體   English   中英

為什么通過引用傳遞涉及復制構造函數?

[英]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, /* ..... */);
}
  1. 我們調用Employee::Employee ,通過const&傳遞fname無副本 )。
  2. 構造函數從第一個參數初始化它的成員firstname
  3. 這練習了std::string(const std::string&) ,再次通過const&傳遞參數(仍然沒有副本)。
  4. 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.

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