c++ 为什么这个重载的运算符〈〈以一种意想不到的方式工作?

um6iljoc  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(148)

我想创建一个方法来为控制台输出添加颜色。我有一个类似于std::leftstd::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)相同的事情?

dxxyhpgq

dxxyhpgq1#

为什么color::red本身也能工作?...它怎么能把enum类型color作为输入,因为它不在重载的operator<<的输入参数中?为什么它做的事情和输入coutColor(color::red)一样?
这是因为coutColor的构造函数没有标记为explicit
当编译器为表达式std::cout << color::red寻找合适的operator<<重载时,它会在作用域中找到您的重载并看到:

  1. coutColor隐式color值构造
    1.运算符通过const引用获取coutColor对象
    因此,编译器能够创建一个临时coutColor对象,将color值传递给它的构造函数,然后将该对象传递给运算符。
    我以前见过function(input) : var(input) {},但我不知道它是什么意思。
    C++, What does the colon after a constructor mean?

相关问题