首页 > 解决方案 > 为什么不为类中创建的静态对象调用构造函数?

问题描述

      #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 的成员,因为静态对象的初始化是在编译时本身完成的,但为什么不调用构造函数。只有在控制到达 AB::obj; 行后,才会调用构造函数。如果我声明静态 A obj;在 B 类之外,然后调用构造函数。为什么两者的行为不同?

标签: objectconstructorstatic

解决方案


乙乙; 当上述行执行时,首先调用 B 的构造函数。所以首先打印“inside b constructor”。

然后当控制到达 obj.function(); obj 已经被编译器初始化,因为它是一个静态类型的对象。因此调用 obj.function() 没有任何问题,并打印“内部函数”。

现在控制到达 AB::obj; 静态对象的定义。因此调用 A 的构造函数并打印“内部 A 构造函数”。

注意:仅当调用静态对象的定义时才使用构造函数。所以只有当静态 A obj 时我们看不到 A 的构造函数;在 B 类中声明。

可能会出现另一个问题,为什么只对类内的静态变量进行声明,而定义需要在类外显式调用?

答案是可以在头文件中定义类,并且该头文件可以包含在多个 *.cpp 文件中。所以,如果定义也存在于类中,那么静态变量将有多个定义,这将导致错误。

为了避免上述情况,只对类外的静态成员进行定义。


推荐阅读