Какова связь между статической функцией класса и конструктором класса? - PullRequest
1 голос
/ 14 апреля 2011

Что происходит каждый раз, когда в классе вызывается статическая функция?Когда выполняется конструктор?

Ответы [ 6 ]

2 голосов
/ 14 апреля 2011

Нет отношений зависимости, то есть вы можете вызывать статический метод, не создавая экземпляр с синтаксисом «Class :: method ()»

class someclass
{
public:
    someclass()
    {
        std::cout << "someclass constructor" << std::endl;
    }

    static void staticmethod()
    {
        std::cout << "someclass staticmethod" << std::endl;
    }
};

, а затем

int main(int argc, char** argv)
{
    someclass::staticmethod();
    return 0;
}

вы увидите распечатанный «статический метод someclass» без упоминания или необходимости вызова конструктора.

1 голос
/ 14 апреля 2011

Фон для статических функций-членов

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

  • , они не получают неявный указатель this, как это делают нестатические функции-члены
    • , поэтому они неявно автоматически распознают, если естьлюбые экземпляры класса, не говоря уже о том, где в памяти находятся экземпляры.
  • они могут работать со статическими переменными-членами, которые также не зависят от экземпляров объекта.

Чтобы понять вышеизложенное, можно представить, что статические члены класса или структуры похожи на автономные не-члены, за исключением того, что:

  • статические члены эффективно дружат с классом
  • статические члены находятся в области видимости класса с целью поиска идентификаторов для сопоставления с вызовами функций или для поиска переменной
  • статические члены могут быть защищены или закрыты в этой области

Итак, они являются гибридом поведения, не являющегося членом и членом.

Как конструкция объекта связана со статической / нестатической мембранойers and threading

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

Построение статических переменных-членов

Тамодна важная проблема, которую, я думаю, вы можете задаться вопросом: когда вызывается конструктор для статических переменных-членов?В соответствии со Стандартом 9.4.2 (здесь я ссылаюсь на окончательный вариант C ++ 98):

-7- Статические члены данных инициализируются и уничтожаются точно так же, как нелокальные объекты (базовые.start.init, basic.start.term).

Важно отметить, что сценарий наихудшего / последнего случая описан в 3.6.2:

-3- Это определяется реализацией независимо от того, динамическая инициализация или нет (dcl.init,class.static, class.ctor, class.expl.init) объекта области именного пространства выполняется перед первым оператором main.Если инициализация откладывается до некоторого момента времени после первого оператора main, она должна произойти до первого использования любой функции или объекта, определенных в той же единице перевода, что и объект, который должен быть инициализирован. *

1 голос
/ 14 апреля 2011

Конструкторы вызываются при создании объекта.

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

1 голос
/ 14 апреля 2011

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

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

Для вызова статического метода вам необходимо использовать оператор Scope Resolution (: :) и квалифицироватьимя метода с именем класса ... Однако, в случае конструктора, он автоматически вызывается с помощью оператора "new".

Надеюсь, это поможет.

0 голосов
/ 14 апреля 2011
  • Для методов класса static означает, что этот метод может быть вызван для самого класса, для использования метода не требуется экземпляр этого класса
  • Для функций в базовой программе C / C ++ статические функции - это функции, которые видны только другим функциям в том же файле
0 голосов
/ 14 апреля 2011

Конструктор выполняется при создании экземпляра объекта.

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