Это вопрос C++ о том, что меня смущает. (Я обновляю свой C++ после долгого времени). Я читаю этот пример здесь. Меня смущают две части:
Первая часть:
В строке кода:
void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )
WINDOW_AUTOSIZE - это вход, но насколько я могу судить, это не int. Когда я кодирую эту строку и запускаю, она работает нормально. Мой ввод в эту функцию буквально "WINDOW_AUTOSIZE". Я смущен, почему это работает. Как WINDOW_AUTOSIZE int?
Мой второй вопрос касается последней строки, в которой говорится:
По умолчанию флаги == CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED
Я смущен тем, как/что это значит... Я знаю, что | побитовое ИЛИ, но не ясно, что именно это означает...
Спасибо.
Мой ввод в эту функцию буквально "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
Рассмотрим следующее: у вас есть клавиатура с 4 ключами:
Ctrl, Alt, Del, Shift
Сколько констант вам понадобилось бы для определения всех состояний, на которые может работать эта клавиатура? Ну позволяет перечислять состояния
Все 4 клавиши нажаты: 1 постоянная
3 нажатых клавиши: требуется (4 на 3) константы = 4 константы:
(4 by 3) = 4! / ( (4-3)! * 3! ) = 4
2 нажатых клавиши: (4 на 2) = 6 констант
1 нажата клавиша: 4 константы (имена клавиш)
Без нажатия клавиши: 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
Чем больше комбинаций у вас есть, тем больше этот метод окупается.
Беспокойство (возможно, вы можете увидеть ссылку на битфлаги), код пользователя может исследовать интегральное значение, чтобы увидеть, какие биты включены.
&
) CAPS_LOCK = ON», поэтому INITIAL_STATE = NUM_LOCK & CAPS_LOCK
. Это спасает вас от определения другого государства
Слова, написанные заглавными буквами, являются константами. Они были определены где-то в коде или в заголовках, которые будут использоваться в другом месте. Константа может стоять за число, строку и т.д. Константы в этом коде, очевидно, имеют тип int
CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED
CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED
- это просто поразрядное ИЛИ значений int
на которые CV_WINDOW_AUTOSIZE | CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED
константы. Это пространственные константы, где задан только один бит int
(так называемые флаги)
Предположим, CV_WINDOW_AUTOSIZE
равен 0x1, а CV_WINDOW_KEEPRATIO
- 0x2. Таким образом, побитовое ИЛИ-ing приведет к 0x3. Вызываемая функция может затем проверить операцию AND, для которой был установлен флаг.
Я верю, что WINDOW_AUTOSIZE не является строкой или текстом. Это будет постоянная константа или постоянная константа #defined. Таким образом, int datatype может принять его. Пожалуйста, проверьте определение WINDOW_AUTOSIZE в исходном коде. Также обратите внимание, что мы можем передавать переменные с типами 'char', 'enum' в функцию, которая принимает int. Преобразование в int будет происходить внутри.
WINDOW_AUTOSIZE
был? Строки ограничены кавычками.