我想创建一个方法来为控制台输出添加颜色。我有一个类似于std::left
和std::setw()
的想法。我最终得到了下面的代码,它完全按照我想要的方式工作。
我明白它是如何工作的,但我想对一些事情做一些澄清,以更好地了解我的知识。
下面是代码:
#include <iostream>
#include <Windows.h>
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
enum class color { blue = FOREGROUND_BLUE, green, cyan, red, purple, yellow, white, bright = FOREGROUND_INTENSITY };
class coutColor {
public:
WORD Color;
coutColor(color colorvalue) : Color((WORD)colorvalue) { }
~coutColor() { SetConsoleTextAttribute(hConsole, (WORD)7); }
};
std::ostream& operator<<(std::ostream& os, const coutColor& colorout) {
SetConsoleTextAttribute(hConsole, colorout.Color);
return os;
}
int main() {
std::cout << coutColor(color::green) << "This text is green!\n";
std::cout << color::red << "This text is red! " << 31 << "\n";
return 0;
}
我理解coutColor(color::green)
是如何在main()
中的cout
中工作的,但是为什么只有color::red
本身也能工作呢?
我在测试不同的东西时偶然发现了它。
它如何将enum
类型color
作为输入,因为它不在重载的operator<<
的输入参数中?
为什么它会做与输入coutColor(color::red)
相同的事情?
1条答案
按热度按时间dxxyhpgq1#
为什么
color::red
本身也能工作?...它怎么能把enum
类型color
作为输入,因为它不在重载的operator<<
的输入参数中?为什么它做的事情和输入coutColor(color::red)
一样?这是因为
coutColor
的构造函数没有标记为explicit
。当编译器为表达式
std::cout << color::red
寻找合适的operator<<
重载时,它会在作用域中找到您的重载并看到:coutColor
可隐式从color
值构造1.运算符通过const引用获取
coutColor
对象因此,编译器能够创建一个临时
coutColor
对象,将color
值传递给它的构造函数,然后将该对象传递给运算符。我以前见过
function(input) : var(input) {}
,但我不知道它是什么意思。C++, What does the colon after a constructor mean?