2015-02-11 1 views
1

В C++ можно использовать элемент данных класса без определения объекта этого класса, указав этот элемент данных в общедоступном разделе как переменную static, как в примере кода ниже. Вопрос в том, почему/когда я хочу это сделать? и как я могу это сделать?Почему/когда я хотел бы использовать элемент данных класса без определения объекта класса?

class ttime{ 
public: 
    ttime(int h=0, int m=0, int s=0):hour(h), minute(m), second(s){} //constructor with default intialization 
    int& warning(){return hour;} 
    void display()const{cout<<hour<<"\t";} 
    static int hello; 
    ~ttime(){} 

private: 
    int hour; 
    int minute; 
    int second; 
}; 


main() 
{ 
    ttime:: hello=11310; //Is this the way to use hello without creating an object of the class? 
    cout << ttime:: hello; 

    ttime hi(9); 
    hi.display(); 
    hi.warning()++;//the user is able to modify your class's private data, which is really bad! You should not be doing this! 
    hi.display(); 
} 
+1

Да, 'static' переменные члены возможны, и они доступны без экземпляра объекта. Почему вы хотели бы, чтобы они были довольно широкой темой. –

ответ

1

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

В случае модификатора 'public static', его легко увидеть в библиотеках, чтобы обеспечить доступ к константам и универсальным функциям (статические методы).

Например, библиотека ввода может иметь:

class KeyEvent 
{ 
    public: 
     static const int KEY_DOWN = 111; 
     static const int KEY_UP = 112; 
     ... 
} 

//And then in your code 
#include <KeyEvent> 

void poolEvent(Key *key) 
{ 
    if(key->type() == KeyEvent::KEY_DOWN) 
     ... 
} 
0

Он похож на глобальную переменную, только если он не определен в глобальном пространстве имен.

Вы находите его в коде C++, который был написан до того, как были введены пространства имен или в мета-программировании шаблонов было более полезным.

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

2

Объявление переменной-члена класса как static по существу делает его одноэлементным объектом, общим для всех экземпляров этого класса. Это полезно для таких вещей, как счетчики, семафоры и блокировки, а также другие типы данных, которые должны совместно использоваться другими членами класса.

Объявление public делает его доступным для всех пользователей этого класса. Как правило, это плохая идея, чтобы позволить переменным класса изменяться функциями вне класса.

С другой стороны, объявление его const является обычным способом предоставления общедоступных констант для класса.

Пример

Ваша библиотека классов:

class Foo 
{ 
public: 
    // Version number of this code 
    static const int VERSION = 1; 

private: 
    // Counts the number of active Foo objects 
    static int   counter = 0; 

public: 
    // Constructor 
    Foo() 
    { 
     counter++;  // Bump the instance counter 
     ... 
    } 

    // Destructor 
    ~Foo() 
    { 
     counter--;  // Adjust the counter 
     ... 
    } 
}; 

Некоторые клиент библиотеки:

class Bar 
{ 
public: 
    // Constructor 
    Bar() 
    { 
     // Check the Foo library version 
     if (Foo::VERSION > 1) 
      std::cerr << "Wrong version of class Foo, need version 1"; 
     ... 
    } 
}; 

В этом примере VERSION статическая константа класса, который в этот случай сообщает внешнему миру, какая версия кода содержится в классе. К нему обращается синтаксис Foo::VERSION.

С другой стороны, переменная static counter является частной для класса, поэтому к ней могут обращаться только функции-члены Foo. В этом случае он используется в качестве счетчика для количества активных объектов Foo.

+0

полезно, но все же «зачем кому-то хотеть использовать элемент данных класса без определения объекта этого класса и как это делается?» –

+0

Поскольку член класса может быть другого типа и использоваться для целей, отличных от (но связанных с) объектов самого типа класса. –

1

Я не знаком с синтаксисом C++ для статики на данный момент. Но в C++ - cli (.net, Visual C++) верно ::.
С целью статики:
Существует много случаев, когда имеет смысл использовать их. В общем, когда вы хотите хранить информацию, принадлежащую самому классу (что означает все объекты класса), а не один объект/экземпляр.

1

Несмотря на то, что для этой цели изначально не были изобретены, staticconstexpr данные из structs являются основой метапрограмм шаблона. Просто посмотрите на стандартный заголовок библиотеки limits в качестве простого примера.

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

#include <iostream> 

template<typename T> 
struct Calipers 
{ 
    static constexpr auto size = sizeof(T); 
}; 

int 
main() 
{ 
    std::cout << "short: " << Calipers<short>::size << "\n"; 
    std::cout << "int:  " << Calipers<int>::size  << "\n"; 
    std::cout << "long: " << Calipers<long>::size << "\n"; 
    std::cout << "float: " << Calipers<float>::size << "\n"; 
    std::cout << "double: " << Calipers<double>::size << "\n"; 
} 

Возможный выход:

short: 2 
int:  4 
long: 8 
float: 4 
double: 8 
Смежные вопросы