Определение статических членов в C ++

Используете ли вы npm для его установки?

Если у вас есть npm, просто сделайте

npm i yarn
25
задан Jaguar 21 August 2010 в 04:49
поделиться

5 ответов

(1.) Почему это не разрешено в C ++?

Из часто задаваемых вопросов о стиле и технике Б ++ Струструпа в C ++ : A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities that needed to be stored in memory as objects.

(2.) Почему константным членам разрешено инициализироваться?

[ прямо сказали, что лучше ]

(3. ) Означает ли это, что статические переменные в C ++ не инициализируются с 0, как в C?

Насколько я знаю, пока вы объявляете статический член var в .cpp, он будет нулевым инициализируется, если не указано иное:

// in some .cpp
int Test::j; // j = int();
18
ответ дан Lightness Races with Monica 28 November 2019 в 18:15
поделиться

Почему это не разрешено в C ++?

До тех пор, пока вы не определите это, переменная не станет l-значением.

Почему константным членам разрешено инициализироваться?

Даже в этом случае определение требуется, если вы собираетесь взять адрес переменной.

9.4.2 Элементы статических данных

2 Объявление члена статических данных в его определении класса не является определением и может быть неполного типа, кроме cv-квалифицированного void. Определение для статического члена данных должно появиться в области пространства имен, включающей определение класса члена. В определении в области пространства имен имя члена статических данных должно быть квалифицировано по имени его класса с помощью оператора ::. Выражение инициализатора в определении статического члена данных находится в области его класса

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

class S {
      static const int size = 42;
      float array[ size ];
};

Означает ли это, что статические переменные в C ++ не инициализируются с 0, как в C?

Нет, они:

3.6.2 Инициализация не -локальные переменные

Переменные со статической продолжительностью хранения (3.7.1) или продолжительностью хранения потока (3.7.2) должны быть обнулены (8.5) перед любой другой инициализацией.

Хотя в C ++ 0x дела обстоят немного сложнее. Все литеральные типы теперь могут быть инициализированы (в отличие от только целочисленных типов в текущем стандарте), что будет означать, что все скалярные типы (включая числа с плавающей точкой) и некоторые типы классов теперь могут быть инициализированы с помощью инициализатора в объявлении.

18
ответ дан dirkgently 28 November 2019 в 18:15
поделиться
class GetData        
{    
private:     
static int integer;   //Static variable must be defined with the extension of keyword static;      
public:      
static void enter(int x)      
{       
integer = x;  //static variable passed through the static function    
}
static int  show()   //declared and defined
{
    return integer;   //will return the integer's value
}        
};        
int GetData::integer = 0;    //Definition of the static variable       
int main()      
{      
   GetData::enter(234);    //value has been passed through the static function enter. Note that class containing static variables may not have the object in main. They can be called by scope resolution operator in main.
   cout<<GetData::show();      
}     
2
ответ дан Muhammad Rehan 28 November 2019 в 18:15
поделиться

Краткий ответ:

Это эквивалентно extern int Test_j = 0; .

Если бы он компилировался, что бы произошло? Каждый исходный файл, включая файл заголовка вашего класса, будет определять символ с именем Test :: j, инициализированный значением 0. Компоновщику это не нравится.

8
ответ дан 28 November 2019 в 18:15
поделиться

Вам нужно будет инициализировать статическую переменную в файле .cpp, а не в объявлении класса.

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

//Header file
class Test
{
  public:
    static int j;
};

//In cpp file

//Initialize static variables here.
int Test::j = 0;

//Constructor
Test::Test(void)
{
   //Class initialize code
}
20
ответ дан 28 November 2019 в 18:15
поделиться
Другие вопросы по тегам:

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