簡體   English   中英

將 istream& 傳遞給 function,調用構造函數?

[英]Passing istream& to function, calls constructor?

我正在閱讀 C++ Primer,Lippman 等。 人。 5/e。

第 7.5.2 節。 委托構造函數說,

class Sales_data {
    friend std::istream &read(std::istream&, Sales_data&);
public:
    // nondelegating constructor initializes members from corresponding arguments
   Sales_data(std::string s, unsigned cnt, double price):
           bookNo(s), units_sold(cnt), revenue(cnt*price) { }

    // remaining constructors all delegate to another constructor
    Sales_data(): Sales_data("", 0, 0) {}
    Sales_data(std::string s): Sales_data(s, 0,0) {}
    Sales_data(std::istream &is): Sales_data()
              { read(is, *this); }

    // other members as before
};

*在此版本的 Sales_data 中,除一個構造函數外,其他所有構造函數都委派了他們的工作。 第一個構造函數需要三個 arguments,使用這些 arguments 來初始化數據成員,並且不做進一步的工作。 在這個版本的 class 中,我們定義了默認構造函數以使用三參數構造函數進行初始化。 它也沒有額外的工作,如空的構造函數體所示。 接受字符串的構造函數也委托給三參數版本。

接受 istream& 的構造函數也代表。 它委托給默認構造函數,而默認構造函數又委托給三參數構造函數。 一旦這些構造函數完成它們的工作,istream& 構造函數的主體就會運行。 它的構造函數體調用 read 來讀取給定的 istream。 *

Function 讀取在第 7.1.3 節中定義如下,

// input transactions contain ISBN, number of copies sold, and sales price

    istream &read(istream &is, Sales_data &item)
    {
    
        double price = 0;
        is >> item.bookNo >> item.units_sold >> price;
        item.revenue = price * item.units_sold;
        return is;
    }

我對這一行感到困惑——一旦這些構造函數完成他們的工作, istream& 構造函數的主體就會運行。 它的構造函數體調用 read 來讀取給定的 istream。

這個對嗎?

IMO,讀取的是全局 function,它不會在任何 object 上調用。 如果有錯誤,請糾正我的理解,並幫助我澄清我的疑問。

istream& 構造函數

這只是“具有istream&類型的(單個)參數的構造函數”的簡寫。

假設我們給構造函數編號:

/*1*/ Sales_data(std::string s, unsigned cnt, double price) //...
/*2*/ Sales_data(): Sales_data("", 0, 0) {}
/*3*/ Sales_data(std::string s): Sales_data(s, 0,0) {}
/*4*/ Sales_data(std::istream &is): Sales_data() //...

引用說明對構造函數 4 的調用將首先導致構造函數 1 和 2 在執行 4 的主體之前按該順序執行。

構造函數 4 的 function 主體包含對read的調用。 這就是“構造函數體調用讀取”所指的。 這是一個完全常見的 function 調用,與構造函數無關。

所以引用是正確的。

IMO,讀取的是全局 function,它不會在任何 object 上調用。

引用沒有使用“被調用”的語言,所以我真的不知道你在這里的意思,但請注意,調用read不是對成員 function 的調用。 沒有像xf()形式的成員 function 調用那樣涉及隱式 object 參數。 這是一個完全正常的免費 function 調用,因為您也可以在 class 上下文之外的任何表達式中使用。

是的,你沒看錯。

找出構造函數執行順序的一種簡單方法是放置一個 cout << "1" << endl; 在花葯中的一個和“2”中,在 read() 中的一個。

暫無
暫無

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

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