代码之家  ›  专栏  ›  技术社区  ›  user1198065

如果我们在c++中重载一个构造函数,那么默认的构造函数是否仍然存在?[副本]

  •  4
  • user1198065  · 技术社区  · 12 年前

    可能重复:
    Why does the default parameterless constructor go away when you create one with parameters

    我写了以下程序

    #include <iostream>
    class A {
    public:
        A(int i) {std::cout<<"Overloaded constructor"<<std::endl;}
    }
    
    int main() {
    A obj;
    return 0;
    }
    

    当我编译程序时,我得到以下错误:

    没有匹配的函数可以调用A::A() 候选人是: A: :A(int) A: :A(常量A&)

    4 回复  |  直到 8 年前
        1
  •  7
  •   eq-    12 年前

    在这种情况下,默认构造函数的存在取决于您是否定义它。如果您自己定义另一个构造函数,它将不再被隐式定义。幸运的是,它很容易恢复:

    A() = default;
    

    请注意,术语“默认构造函数”指的是可以在没有任何参数的情况下调用的任何构造函数(12.1p5);不仅适用于有时隐式定义的构造函数。

        2
  •  5
  •   Alex1985    12 年前

    不,根据标准,在这种情况下不会生成默认构造函数。但是,在C++11中,您可以声明您希望通过使用以下方法生成默认构造函数:

    class A {
    public:
      A() = default;
      A(int);
    };
    
        3
  •  0
  •   SingerOfTheFall    12 年前
    • 您可以按照上面的建议编写默认构造函数,也可以在您的main函数中编写:

      A* obj = new A();

    • 例如,您可以在主函数中写入

      A* obj = new A(5);

    • 您可以在构造函数中设置

      public:
      A(int i=0) 
      { 
          cout << "My own  constructor!"; 
      }; 
      

      使用它,当您创建该类的对象时,您可以编写

      `A* obj = new A(5);`
      

      这将改变变量i,使其具有值 5
      或者你可以像这样初始化你的对象

      `A* obj = new A();` 
      

      这将使变量i保留默认值 0

        4
  •  0
  •   Niklas Hansson    12 年前

    这是C++的约定。当您编写了任何用户定义的构造函数时,它假设您不需要隐式非参数构造函数。这是可以理解的,所以记住它。