cpp_constructor - ShenYj/ShenYj.github.io GitHub Wiki

Constructor

构造函数

构造函数(也叫构造器),一般在对象创建的时候自动调用,完成对象的初始化工作

  • 特点

    • 函数名与类同名,无返回值(void都不能写),可以有参数,可以重载,可以有多个构造函数

      struct Person {
          int m_age;
      
          Person() {
              
          }
      };
    • 一旦自定义了构造函数,必须用其中一个自定义的构造函数来初始化对象

      struct Person {
          int m_age;
      
          Person() {
              m_age = 0;
              cout << "Person()" << endl;
          }
      
          Person(int age) {
              m_age = age;
              cout << "Person(int age)" << endl;
          }
      };
      
      Person g_person0;       // Person()
      Person g_person1();     // 函数声明  不会创建对象
      Person g_person2(10);   // Person(int)
      
      int main() {
      
          Person person0;     // Person()
          Person person1();   // 函数声明  不会创建对象
          Person person2(20); // Person(int)
      
          Person *p0 = new Person;        // Person()
          Person *p1 = new Person();      // Person()
          Person *p2 = new Person(30);    // Person(int)
      
          /* 4个无参,3个有参,一共创建了7个Person对象 */
      
          getchar();
          return 0;
      }
  • 注意

    • 通过malloc分配的对象不会调用构造函数

      struct Person {
          int m_age;
      };
      
      int main() {
          
          /// 不会调用构造函数
          Person *p = (Person *)malloc(sizeof(Person));
          p->m_age = 10;
          free(p);
      
          return 0;
      }

在某些特定的情况下,编译器才会为类生成空的无参的构造函数, C++ 中取决于类实例化过程中是否有初始化工作需要执行

  • 此时汇编中不会出现 call Person:: Person

    struct Person {
        int m_age;
    };
    
    int main() {
        
        Person p;
        p.m_age = 10;
        return 0;
    }
  • 此时汇编中会出现 call Person:: Person

    struct Person {
        int m_age = 0;
    };
    
    int main() {
        
        Person p;
        p.m_age = 10;
        return 0;
    }

区别是成员变量初始有值, 在初始化时需要初始化成员变量

构造函数调用构造函数,不能直接调用,必须通过初始化列表调用, 参考笔记: 初始化列表

⚠️ **GitHub.com Fallback** ⚠️