C++ 操纵器

C++ manipulators

我已经开始学习 C++,我认为这门语言很棒,但在我学习它的过程中,很少有事情让我感到困惑。在这个例子中:

cout << setiosflags(ios::fixed) << setiosflags(ios::showpoint);

在这个例子中,如果我只键入 showpoint 而没有 setiosflags,为什么我们要键入整个 setiosflags(ios::...) 而程序仍然执行相同的操作?

我的第二个问题很简单。如果我们有以下内容:

int x=0;
cin>>x;

为什么我们要为 int 定义一个值,如果我们稍后将其更改为不同于 0 的值?

它提供了可选和灵活的语言,因此您可以使用 setiosflgas 或如下所示设置操纵器:

float y= 1.45;
std::cout << std::fixed<<std::showpoint<<y;

为什么要坚持初始化变量是因为在C++11之前,这些未初始化的变量可以保存垃圾值,直到你为它们设置值。它可能会产生不需要的问题和错误。所以更好的做法是在定义变量时始终初始化变量。

自 C++11 起,如果您使用如下显式构造函数,所有基本数据类型都将初始化为零:

int i2 = int(); // initialized with zero 
int i3{}; // initialized with zero (since C + + 11)
  1. 流操纵器std::setiosflags(ios_base::fmtflags mask)- 是一个设置由参数mask 指定的格式标志的函数。通过使用 binary AND : &,它可以同时用于多个标志。它的存在可能是为了提供属于 class 的 full/complete 功能。现在关于你的问题:

If you can access a flag(member) directly, why bother using a function(setter)?

我想不出任何你不应该这样做的理由。但是请记住,manipulators 是全局函数,而这些常量 ios_base::fmtflags 是成员常量。有关操纵器的更多信息 check this.

  1. 关于第二个问题:在定义变量时对其进行初始化,以避免在为变量赋值之前错误地使用它时发生未定义的行为。局部变量需要初始化,全局变量默认初始化。

why do we type the wholesetiosflags(ios::...)when the program still does the same if I only type showpoint without setiosflags?

我们不这样做,除非我们希望程序比必要的更冗长。正如您所说,使用单个标志流式传输 setioflags 等同于流式传输标志本身。如果您有一组预先计算好的要设置的标志,则可以使用 setioflags

Why do we define a value for int if we later change it to something different than 0?

同样,我们不会,除非我们喜欢不必要的冗长。但初始化变量是一个好习惯,以避免以后更改代码以假设它已被初始化时出现未定义的行为。