2

我已经开始学习C++,我认为这门语言很棒,但在我学习 C++ 的过程中,几乎没有什么让我感到困惑。在这个例子中:

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

在这个例子中,如果我只输入without ,为什么setiosflags(ios::...)程序仍然执行相同的操作时我们要输入整体?showpointsetiosflags

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

int x=0;
cin>>x;

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

4

3 回答 3

1

如果我只键入without ,为什么setiosflags(ios::...)程序仍然执行相同的操作时,我们要键入整体?showpointsetiosflags

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

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

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

于 2015-05-18T23:00:56.567 回答
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)
于 2015-05-18T19:42:07.243 回答
-1
  1. 流操纵器std::setiosflags(ios_base::fmtflags mask)- 是一个设置由参数指定的格式标志的函数mask通过使用二进制 AND : ,它可以同时用于多个标志&。它可能存在以提供所属类的完整/完整功能。现在关于你的问题:

如果您可以直接访问标志(成员),为什么还要使用函数(设置器)?

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

  1. 关于第二个问题:在定义变量时初始化变量以避免未定义的行为,以防在分配任何值之前错误地使用它。局部变量需要初始化,全局变量默认初始化。
于 2015-05-18T20:54:31.067 回答