нестатические и статические функции и переменные - PullRequest
10 голосов
/ 18 февраля 2010

У меня один вопрос о статической и нестатической функции и переменной.

1) Нестатическая функция доступа к статической переменной.

Все нормально!

class Bar
{
public:

     static int i;

     void nonStaticFunction() {

         Bar::i = 10;

     }

};

int Bar::i=0;

2) нестатический доступ к функции нестатическая переменная

Определенно ОК!

3) статический доступ к функции статическийпеременная и функция

Определенно в порядке!

4) статический доступ к функции нестатическая функция

все нормально

class Bar
{
public:
     static void staticFunction( const Bar & bar)
     {
         bar.memberFunction();

     }

     void memberFunction() const
     {

     }

}

5) статический доступ к функции нестатическийпеременная

Это нормально или нет?Я озадачен этим!

Как насчет этого примера

class Bar
{
public:
     static void staticFunction( Bar & bar)
     {
         bar.memberFunction();

     }

     void memberFunction()
     {

         i = 0;
     }

     int i;

};

Ответы [ 4 ]

13 голосов
/ 18 февраля 2010

доступ к статической функции нестатическая переменная

Это нормально или нет?Я озадачен этим!

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

Так что да, код в вашем последнем примере действителен, потому что вы переданы в экземпляре.Тем не менее, вы не могли сделать:

static void staticFunction()
{
    // error, this function is static, and is therefore
    // not bound to a specific instance when called
    i = 5;


}
7 голосов
/ 18 февраля 2010

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

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

Нестатические средства подразумевают экземпляр и могут отличаться в разных экземплярах.

Так что, по сути, нет смысла обращаться к нестатическим членам из статических методов.

1 голос
/ 18 февраля 2010

Для этого вам нужно понять, что такое статическое.

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

Для доступа к статическому члену класса мы используем следующий формат ::

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

1 голос
/ 18 февраля 2010

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

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

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