почему конструктор не вызывается для статических c объектов, созданных внутри класса? - PullRequest
0 голосов
/ 11 июля 2020
      #include<iostream>

      class A
      {
        public:
        int x;
        A()
         {
            x=4;
            std::cout<<"inside A constructor"<<std::endl;
      }
      void function()
      {
        std::cout<<"inside function"<<x<<std::endl;
      }

      };

      class B
      {
         public:
         B()
         {
          std::cout<<"inside b constructor"<<std::endl;
          obj.function();

         }
         private:
         static A obj;
         };
         B b;
         A B::obj;

        int main()
         {

          }

В приведенном выше коде obj.function (); вызывается впервые, он знает, что obj является членом класса A, поскольку инициализация объектов stati c выполняется во время самой компиляции, но почему не вызывается конструктор. Конструктор вызывается только после того, как элемент управления попадает в строку AB :: obj; если я объявляю stati c A obj; вне класса B вызывается конструктор. почему поведение у обоих разное?

1 Ответ

0 голосов
/ 12 июля 2020

B b; когда выполняется вышеуказанная строка, сначала вызывается конструктор B. поэтому сначала печатается «внутри конструктора b».

Затем, когда элемент управления достигает obj.function (); объект obj уже инициализирован компилятором, поскольку это объект типа stati c. поэтому obj.function () вызывается без проблем и печатается «внутренняя функция».

Теперь элемент управления достигает AB :: obj; определение объекта stati c. поэтому вызывается конструктор A и печатается «внутри конструктора A».

примечание: конструктор используется только тогда, когда вызывается определение объекта stati c. поэтому только мы не видим конструктор A, если stati c A obj; объявлен внутри класса B.

Может возникнуть другой вопрос, почему объявление делается только для переменных c внутри класса, а определение должно вызываться явно вне класса?

Ответ следующий: определение класса может быть выполнено в файле заголовка, и этот файл заголовка может быть включен в несколько файлов *. cpp. Итак, если определение также присутствует внутри класса, тогда переменная stati c будет иметь несколько определений, которые вызовут ошибку.

Inorder, чтобы избежать вышеуказанного, определение для членов stati c вне класса сделано исключительно.

...