Есть ли подводные камни, если мы используем аргумент по умолчанию для статической переменной-члена? Как это:
enum Index
{
INDEX_A = 0,
INDEX_B
};
class foo
{
public:
static void method1( int a, int b = INDEX_A);
};
Компилятор никогда не жалуется, но я всегда осторожен, когда дело касается статики.
Технически я бы использовал:
static void method1( int a, Index b = INDEX_A);
но кроме этого статические функции ничем не отличаются от любых других функций. У них просто нет «скрытого» this
параметр передан, поэтому функция не вызывается с экземпляром класса.
Также обратите внимание, что при использовании аргументов по умолчанию вы можете получить действительно забавные вещи, если позже определите свою функцию, используя это:
static void method1( int a, Index b = INDEX_B)
{
...
}
потому что, в зависимости от того, где вы вызываете функцию, вы можете иметь b
со значением INDEX_A
или же INDEX_B
(если вы позвоните перед определением или в другой единице перевода, INDEX_A
, если вы называете это после определения, это, вероятно, будет INDEX_B
). Аргумент заполняется компилятором в точке вызова.
Ваш комментарий о статическом члене относится к статическому члену VARIABLES. Функции-члены существуют, как только код компилируется и связывается. Нормальные переменные-члены создаются при создании экземпляра класса, например, когда код выполняет код для foo x
или же foo *p = new foo;
). Статические переменные-члены имеют «глобальную длительность хранения», иными словами, они похожи на глобальные переменные, просто их имя находится внутри класса, а не на обычные глобальные переменные.
И да, вам нужно беспокоиться о порядке инициализации, когда речь идет о статических переменных-членах, если вы используете их между единицами перевода (разные исходные файлы = разные единицы перевода). Порядок инициализации не определен (по стандарту) между различными TU.