我正在接触一些 C++,并且正在阅读一个介绍,其中这段代码片段让我有点想知道:
cout << "\nPlease enter an article label: ";
// Input the label (15 characters maximum):
cin >> setw(16); // or: cin.width(16);
cin >> label;
作者没有告诉我为什么对于一根输入线我需要(或可以使用)两次
cin
,一次带有操纵器,一次带有修改的地方?
现在,在关于流的第 4 章中,根据我到目前为止所读到的内容,我预计这是两个单独的实例,因此会执行操作。因此,在我天真的阶段,我会写:
cin >> setw(16) >> label; // according to: cout << setw(16) << label;
你能向我解释一下,为什么两次
cin
结果只有一行输入吗?看起来,这里提出的类似问题不够相似 - 经过检查后。
我可以简单地接受并复制它。但我想了解一下。
是否只是因为在带有
cin
的第一行中没有地方可以写入输入 2,因此它创建了该字段,然后从第二行中的 cin 中“使用”该字段?如果是这样,是否有充分的理由将其分成两行?
cin >> setw(16);
cin >> label;
执行方式与:
相同cin >> setw(16) >> label;
它的工作原理如下:
cin >> setw(16)
。
这是对继承的 istream
成员函数的调用:
istream& operator>>( std::ios&(*func)(std::ios&) );
setw(16)
在这里被视为func
,它是一个指向函数的指针,该函数在调用时采用std::ios&
参数。 std::cin
源自 std::ios
。operator>>
的 cin
成员函数内,它将调用 func
并将对其自身的引用作为参数传递:
func(*this);
和 func
会依次执行以下操作:
std::istream& func(std::istream& stream) {
stream.width(16);
return stream;
}
最后 operator>>
返回对 *this
的引用,这是我们的 cin
。label
,并且由于 cin
是从第一个操作返回的,所以剩下的只是
cin >> label