在我们学习使用构造函数和析构函数之前很久,我们学习了很多使用printf()
的知识。因此,当切换到C++时,许多控制台将输出printf()
。为什么不在C++中使用printf()
有时候你可以听到:
printf()
是坏的,你应该使用cout <<
相反,因为它是C++
什么是使用printf()
放弃并切换到cout <<
的优势呢?
在我们学习使用构造函数和析构函数之前很久,我们学习了很多使用printf()
的知识。因此,当切换到C++时,许多控制台将输出printf()
。为什么不在C++中使用printf()
有时候你可以听到:
printf()
是坏的,你应该使用cout <<
相反,因为它是C++
什么是使用printf()
放弃并切换到cout <<
的优势呢?
C++ faq指出:
[15.1]我为什么要使用
<iostream>
代替传统<cstdio>
?增加类型安全性,减少错误,允许扩展性并提供可继承性。 012fprintf()可以说没有被破坏,并且尽管容易出错,但scanf()也许是可居住的,但是对于C++ I/O的功能而言,两者都是有限的。 C++ I/O(使用< <和>>)是相对于C(使用
printf()
和scanf()
)。
更多类型安全:随着
<iostream>
,对象被I/O的类型是由编译器静态地已知的。相反,使用“%
”字段来动态地确定类型。不易出错:使用
<iostream>
时,没有多余的“%
”令牌必须与实际的I/O对象一致。删除冗余可消除一类错误。可扩展:C++
<iostream>
机制允许新的用户定义类型在不破坏现有代码的情况下进行I/O。想象一下,如果每个人都同时为printf()和scanf()添加新的不兼容“%
”字段,那么混乱就会发生?可继承:C++的
<iostream>
机构从真实的类,如std::ostream
和std::istream
建造。不像<cstdio>
的FILE*
,这些是真实的类,因此是可继承的。这意味着你可以拥有其他用户定义的东西,看起来像流一样,但它可以做任何你想要的奇怪和美妙的事情。您将自动使用由您甚至不知道的用户编写的大量I/O代码行,并且他们不需要知道您的“extended stream
”类。
cout
是更加面向对象的,并提供一些优点。但我是一位老派开发人员,对printf()
非常满意。虽然,我现在不写很多控制台应用程序,但如果我这样做,我很可能会使用printf()
。
这是一件好事:你可以选择你最喜欢的一个。
而且,在大多数情况下,printf()方法*比* >>操作符的连续序列更具可读性。通常,您可以查看printf()格式的字符串并查看输出的格式。实际上,您可以将printf()格式的字符串视为与格式化输出的问题域匹配的“域特定语言”。从这个意义上说,C++ I/O是一个巨大的后退步骤 - 你不能浏览所有那些'>>'运算符,并快速了解输出的结果。 C++ I/O是一个失败的实验,恕我直言。要喜欢它,你必须专注于类型安全,并忽略你放弃的一切...... –
它是类型安全的。 – SLaks
@SLaks:即使您在使用'printf'进行类型错误时,体面的编译器也会发出诊断信息。 – 6502