Почему я не могу инициализировать свой статический элемент данных в моем конструкторе

Я прочитал ответ в парасдвиге, но мне нужны разрядные детали относительно того, почему привычка компилятора позволяет определять статическую членскую переменную в конструкторе.

Ответ будет высоко цениться.

Спасибо.

19
задан mahesh 24 February 2010 в 05:39
поделиться

4 ответа

статические переменные-члены не связаны с каждым объектом класса. Его разделяют все объекты. Если вы инициализируете в ctor, это означает, что вы пытаетесь связать с конкретным экземпляром класса. Поскольку это невозможно, это запрещено.

27
ответ дан 30 November 2019 в 03:59
поделиться

Кроме цикла while, Не уверен, может ли операция% быть оптимизирована в целом, но оптимизация может произойти на образце значений для a & b.

Если в эти 21495808 раз операция выполняется.

Если вероятность передачи значения для a, которое меньше b (a < b), составляет не менее половины от этого. Добавление следующего оператора определённо улучшит общую производительность функции.

if ( abs(a) < b ) // not specifically the abs function, can be your own implementation.
    return 0;
else
    return a%b;

Если b является степенью 2 для по крайней мере 80% случаев, мы можем использовать побитовые операторы, как в

return ( abs(a) & (b-1) );

Если ожидается, что числа будут чем-то меньшим, это ухудшит производительность, так как нам нужно проверить, является ли b мощностью 2 [даже после использования побитовых операторов для того же] для всего.

Даже функциональность для достижения abs (a) может быть оптимизирована с помощью побитовых операторов с их собственными ограничениями, но быстрее, чем проверка, является ли a < 0.

n = (a ^ (a >> 31)) - (a >> 31); // instead of n = a < 0 ? -a : a;

Было бы больше таких вещей, если бы вы могли исследовать.

-121--2088779-
int temp;

temp= (a > 0)? ( a % b ) :   b -( (-a) % b ) ;

код ниже:

int main()
{
int a;
unsigned b;
int temp;
printf("please enter an int and a unsigned number\n");
scanf("%d",&a);
scanf("%u",&b);
modulus(a,b);
temp= (a > 0)? ( a % b ) :   b -( (-a) % b ) ;
printf("\n temp is %d", temp);
return 0;
}
void modulus(int x,unsigned y)
{
int c;
if(x>0)
{
c=x%y;
printf("\n%d\n",c);}
else
{
while(x<0)
x+=y;
printf("\n%d\n",x);}
}


./a.out
please enter an int and a unsigned number
-8 3

1

 temp is 1
-121--2088776-

статическая переменная не может быть определена ни в одном методе (даже если метод является статическим), однако можно определить статическую переменную вне конструктора и назначить значение внутри конструктора. Но при этом переменная будет доступна всему классу.

0
ответ дан 30 November 2019 в 03:59
поделиться

Я полагаю, вы имеете в виду его использование в списке инициализации конструктора. Статический член данных используется всеми экземплярами класса. Его можно инициализировать один раз (по определению инициализации), поэтому нет смысла инициализировать его для каждого экземпляра.

Однако вы можете присвоить ему значение (или изменить существующее значение) в теле конструктора. Или, если член данных является константой, вы можете инициализировать его статически вне конструктора.

5
ответ дан 30 November 2019 в 03:59
поделиться

1) Статические переменные являются свойством класса, а не объекта. 2) Любая статическая переменная инициализируется до создания каких-либо объектов.

  • Поэтому компилятор не позволяет определять статическую переменную внутри конструктора, так как конструктор будет вызываться при создании объекта.
0
ответ дан 30 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: