2016-11-27 59 views
3

我一直在使用操纵器一段时间没有完全理解它们是如何工作的。为什么std :: uppercase不能和字符串一起工作?

此代码:

std::cout << std::hex << std::showbase; 
std::cout << std::uppercase << 77 << '\n'; 
std::cout << std::nouppercase << 77 << '\n'; 

或可替代地这样:

std::cout << std::hex; 
std::cout << std::setiosflags(std::ios::showbase | std::ios::uppercase) << 77 << '\n'; 
std::cout << std::nouppercase << 77 << '\n'; 

两个输出此:

0X4D // 'X' and 'D' uppercase 
0x4d // 'x' and 'd' lowercase 

然而没有下面的代码行可以转换为“abcd “以大写字母。为什么?

std::cout << std::uppercase << "abcd" << '\n'; 
std::cout << std::setiosflags(std::ios::uppercase) << "abcd" << '\n'; 

的另一个问题是,为什么showbaseuppercase必须std::ios::合格内std::setiosflags()只有用std::该功能之外?

Finaly,为什么std::hex无法里面std::setiosflags()

接受谢谢

回答

6

阅读std::uppercase的文档。

允许在浮点和十六进制整数输出中使用大写字符。

std::ios_base::hexstd::setiosflags接受有在docs一个例子。

下面是std::uppercase的例子:

#include <iostream> 
int main() 
{ 
    std::cout << std::hex << std::showbase 
       << "0x2a with uppercase: " << std::uppercase << 0x2a << '\n' 
       << "0x2a with nouppercase: " << std::nouppercase << 0x2a << '\n' 
       << "1e-10 with uppercase: " << std::uppercase << 1e-10 << '\n' 
       << "1e-10 with nouppercase: " << std::nouppercase << 1e-10 << '\n'; 
} 

下面是std::setiosflags的例子:

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::cout << std::resetiosflags(std::ios_base::dec) 
       << std::setiosflags( std::ios_base::hex 
            | std::ios_base::uppercase 
            | std::ios_base::showbase) << 42 << '\n'; 
} 

的定义:

std::hex被定义为std::ios_base& hex(std::ios_base& str);

std::ios_base::hex定义为static constexpr fmtflags hex = /*...*/;

2

std::uppercase只影响转化为十六进制的结果。

std::hex是一个机械手对象,而setiosflags预计通过单独的位组合而形成的整数。或者更确切地说,是一种以这种方式行事的类型。而不是std::hex(这是错误的类型),您可以使用std::ios_base::hex

相关问题