2012-03-13 2 views
0

Какая разница между статической членной переменной класса и «свободной» переменной, определенной в «теле» класса? Я имею в виду, могу ли я использовать второй вместо первого, чтобы выпустить заголовок класса?Удаление статического элемента из заголовка

// b.h 
class B 
{ 
public: 
    B(int j); 
    void print(); 
private: 
    static int is; 
}; 


//b.cpp 
#include <iostream> 

int i = 0; 
int B::is = 0; 

B::B(int j) 
{ 
    i = j; 
    is = j; 
} 

void B::print(){ 
    std::cout << i << " " << is << " " << std::endl; 
} 

//main.cpp 
int main() { 
    B b1(1); 
    b1.print(); 
    B b2(2); 
    b2.print(); 
    b1.print(); 
    return 0; 
} 

выход:

1 1 
2 2 
2 2 

ответ

2

В вашем случае, разница в том, что данные, статические члены могут быть доступны только по классу, так как она объявлена ​​в private секции класса, который может быть желательным в некоторых случаях. Глобальный i может быть изменен кем угодно.

Так что, если переменная предназначена только для класса и не должна использоваться другими, то статические данные элемента в разделе private являются лучшим решением. Это дает вам ограниченный доступ к переменной. Глобальные переменные в целом плохие, поскольку они предоставляют неограниченный доступ ко всем.

Обратите внимание, что в вашем случае глобальная переменная i имеет внешняя связь. В других файлах можно просто объявить как extern int i, а затем использовать i и изменить это также.

Даже если вы сделаете это static глобальной переменной, чтобы сделать его иметь внутреннюю связь, это не хорошо по сравнению с static данных пользователя, поскольку статические данные член дает какую-то идею, что переменная используется только класс, а не члены non-class (если они есть в одном файле). Таким образом, данные типа static повышают читаемость по сравнению с глобальными данными static.

+0

У этого есть область действия файла b.cpp, кто может изменить его и как? –

+0

@DmitryKachko: Из других файлов можно использовать глобальную переменную, так как в вашем случае она имеет «внешнюю» связь. В других файлах вы можете просто объявить как 'extern int i', а затем использовать переменную (и * modify *). – Nawaz

+0

глобальные переменные являются плохими по причине столкновения пространств имен, конечно, я могу помещать их в пространство имен, и это просто простой пример, и это не вопрос вопроса. –

Смежные вопросы