将 istream& 传递给函数,调用构造函数?
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 中,除了一个构造函数之外,所有构造函数都委托他们的工作。第一个构造函数采用三个参数,使用这些参数来初始化数据成员,并且不做进一步的工作。在此版本的 class 中,我们定义默认构造函数以使用三参数构造函数进行初始化。它也没有额外的工作,如空的构造函数体所示。采用字符串的构造函数也委托给三参数版本。
采用 istream& 的构造函数也进行委托。它委托给默认构造函数,而默认构造函数又委托给三参数构造函数。 一旦这些构造函数完成了它们的工作,istream& 构造函数的主体就是运行。它的构造函数体调用 read 来读取给定的 istream.*
函数read在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,read 是一个全局函数,不会在任何对象上调用。理解有误请指正,请帮我解惑。
是的,你没看错。
找出构造函数执行顺序的一种简单方法是将 cout << "1" << endl;在一个中,“2”在花药中,一个在 read() 中。
the istream& constructor
这只是“具有 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 将首先导致在执行 4 的主体之前按该顺序执行构造函数 1 和 2。
构造函数 4 的函数体包含对 read
的调用。这就是“constructor body calls read”所指的。这是一个完全正常的函数调用,与构造函数无关。
所以引用是正确的。
IMO, read is a global function which is not called on any object.
引用没有使用“调用”的语言,所以我真的不知道你在这里的意思,但请注意对 read
的调用不是对成员函数的调用。没有像 x.f()
形式的成员函数调用那样涉及隐式对象参数。这是一个完全正常的自由函数调用,因为您也可以在 class 上下文之外的任何表达式中使用。
我正在阅读 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 中,除了一个构造函数之外,所有构造函数都委托他们的工作。第一个构造函数采用三个参数,使用这些参数来初始化数据成员,并且不做进一步的工作。在此版本的 class 中,我们定义默认构造函数以使用三参数构造函数进行初始化。它也没有额外的工作,如空的构造函数体所示。采用字符串的构造函数也委托给三参数版本。
采用 istream& 的构造函数也进行委托。它委托给默认构造函数,而默认构造函数又委托给三参数构造函数。 一旦这些构造函数完成了它们的工作,istream& 构造函数的主体就是运行。它的构造函数体调用 read 来读取给定的 istream.*
函数read在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,read 是一个全局函数,不会在任何对象上调用。理解有误请指正,请帮我解惑。
是的,你没看错。
找出构造函数执行顺序的一种简单方法是将 cout << "1" << endl;在一个中,“2”在花药中,一个在 read() 中。
the istream& constructor
这只是“具有 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 将首先导致在执行 4 的主体之前按该顺序执行构造函数 1 和 2。
构造函数 4 的函数体包含对 read
的调用。这就是“constructor body calls read”所指的。这是一个完全正常的函数调用,与构造函数无关。
所以引用是正确的。
IMO, read is a global function which is not called on any object.
引用没有使用“调用”的语言,所以我真的不知道你在这里的意思,但请注意对 read
的调用不是对成员函数的调用。没有像 x.f()
形式的成员函数调用那样涉及隐式对象参数。这是一个完全正常的自由函数调用,因为您也可以在 class 上下文之外的任何表达式中使用。