我是 C++ 新手,我对std::endl
. 当试图了解它是什么时std::endl
,我遇到了一些资源,这些资源告诉我它是一个函数。
但是,一个函数怎么能没有括号呢?
我是 C++ 新手,我对std::endl
. 当试图了解它是什么时std::endl
,我遇到了一些资源,这些资源告诉我它是一个函数。
但是,一个函数怎么能没有括号呢?
阅读参考:
std::endl
插入换行符并刷新流。
它与流一起使用,例如std::cout
.
它不是一个函数,它是一个函数模板。
std::endl
没有括号是指一组重载函数 - 该函数模板的所有可能的特化。阅读更多std::endl 如果它是一个函数,它如何不使用任何括号?
但是,一个函数怎么能没有括号呢?
函数的名称,后面没有()
,只是对该函数的引用。它与任何其他类型完全相同:
void foo(int) {}
char x = 'a';
char *p = &x;
int main()
{
p; // Refers to p
*p; // Dereferences p (refers to whatever p points to)
foo; // Refers to foo
foo(42); // Calls foo
}
std::endl
是一个函数(实际上是一个函数模板),它接受一个“流”类型的参数,并通过将 EOL 表示插入该流然后刷新它来工作。如果您愿意,您实际上可以像使用任何其他功能一样使用它:
std::endl(std::cout);
最后一个难题是标准库提供了一个重载(同样是一个模板),operator <<
使得 LHS 参数是一个流,而 RHS 参数是一个函数;此运算符的实现调用 RHS 参数(函数)并将其传递给 LHS 参数(流)。从概念上讲,有这样的事情:
Stream& operator<< (Stream &s, const Function &f)
{
f(s);
return s;
}
因此,调用std::cout << std::endl
会调用该运算符重载,而该运算符重载又会调用std::endl(std::cout)
执行 EOL 插入 + 刷新的 。
至于首选哪种形式(直接调用与<<
操作员),肯定是使用<<
. 它是惯用的,它允许在单个表达式中轻松组合多个流操纵器。像这样:
std::cout << "Temperature: " << std::fixed << std::setprecision(3) << temperature << " (rounds to " << std::setprecision(1) << temperature << ')' << std::endl;
endl是一个仅输出 I/O 操纵器。
endl 是一个仅输出 I/O 操纵器,它可以用诸如
out << std::endl
for any out of type 之类的表达式来调用std::basic_ostream
。在输出序列 os 中插入一个换行符并刷新它,就好像通过调用
os.put(os.widen('\n'))
后跟os.flush()
.