2016-11-27 60 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

相關問題