метод статического члена c ++ с аргументом по умолчанию

Есть ли подводные камни, если мы используем аргумент по умолчанию для статической переменной-члена? Как это:

enum Index
{
INDEX_A = 0,
INDEX_B
};

class foo
{
public:
static void method1( int a, int b = INDEX_A);
};

Компилятор никогда не жалуется, но я всегда осторожен, когда дело касается статики.

5

Решение

Технически я бы использовал:

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.

4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector