c++函数接受整型,但示例显示文本

C++ function takes ints, but example shows text?

本文关键字:显示 文本 函数 整型 c++      更新时间:2023-10-16

这是一个让我困惑的c++问题。(长时间使用c++后,我正在刷新我的c++)。我正在这里读这个例子。有两部分让我很困惑:

第一部分:

在代码行中:

void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )

WINDOW_AUTOSIZE是一个输入,但据我所知,它不是int型。当我编写这行代码并运行时,它工作得很好。我在这个函数中的输入是'WINDOW_AUTOSIZE'。我很困惑为什么这是有效的。WINDOW_AUTOSIZE是怎么变成int的?

我的第二个问题是关于最后一行,他们说:

默认情况下,flags == CV_WINDOW_AUTOSIZE | cv_window_keepatio |CV_GUI_EXPANDED

我很困惑,这究竟意味着什么……我知道|是位或,但不清楚这到底意味着什么…

谢谢。

大写字母的单词为常量。它们已经在代码的某个地方定义,或者在另一个地方使用的头文件中定义。常数可以表示数字、字符串等。这段代码中的常量显然属于int

类型。

CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED只是常数所代表的int值的位或。这些是空间常量,其中仅设置int的一位(即所谓的标志)

CV_WINDOW_AUTOSIZE为0x1, CV_WINDOW_KEEPRATIO为0x2。所以按位或运算的结果是0x3。然后,被调用的函数可以通过and操作检查设置了哪个标志。

我在这个函数中的输入是'WINDOW_AUTOSIZE'

是的,WINDOW_AUTOSIZE实际上是一个整数;int函数参数的默认实参。如果它不是int

,它将无法编译
// it might have been defined like this
#define WINDOW_AUTOSIZE 23434 // some number just for example
// or like this
const int WINDOW_AUTOSIZE = 34234;

对于第二个问题,按位OR表示相应整数值中的所有位都是按OR组合在一起的,所以我们说,例如

CV_WINDOW_AUTOSIZE   = 0x0010 
CV_WINDOW_KEEPRATIO  = 0x0100
CV_GUI_EXPANDED      = 0x1100

则相应的运算将给出一个整数值,每个位都等于OR对每个位置

的结果。
CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED = 
0x0010 
0x0100
0x1100
------
0x1110

关于bitflags的使用

你有一个有4个键的键盘:

Ctrl, Alt, Del, Shift

你需要多少个常量来定义这个键盘可以打开的所有状态?我们来列举状态

  1. 所有4个键按下:1常数

  2. 按下3个键:它需要(4 × 3)常数= 4个常数:

    (4 by 3) = 4! / ( (4-3)! * 3! ) = 4 
    
  3. 2:按下的按键(4×2)= 6常量

  4. 1键按下:4个常量(键名)

  5. 未按下键:1常数

所以总结一下你可以定义:

1 + 4 + 6 + 4 + 1 = 16 constants
: 如果我告诉你只需要4个不同的常数,每个只有一个位是ON的呢?
#define CtrlK  0x0001
#define AltK   0x0010
#define DelK   0x0100
#define ShiftK 0x1000

那么键盘的任何状态都可以通过以上的组合来表示:假设您想要表示按下Shift键和Del键。那么它就是

CtrlK | DelK

您拥有的组合越多,该技术的回报就越多。

当然(也许你可以看到有关bitflags的参考),用户代码可以探测整数值,以查看哪些位被打开。

我相信WINDOW_AUTOSIZE不是字符串或文本。它将是一个常量或#defined预处理器常量。所以int数据类型可以接受它。请检查源代码中WINDOW_AUTOSIZE的定义。还请注意,我们可以将'char', 'enum'数据类型的变量传递给接受int的函数。到int的转换将在内部进行。