【问题标题】:Should we need to provide a default constructor in c++ if we use a parameter constructor?如果我们使用参数构造函数,我们是否需要在 C++ 中提供默认构造函数?
【发布时间】:2014-06-13 12:10:02
【问题描述】:

如果我们使用参数构造函数,我们是否需要在 c++ 中提供默认构造函数? 我的代码是这样的。

ReadConfigParams::ReadConfigParams(char *file)

【问题讨论】:

  • 如果您的班级需要,可以。如果没有,没有。
  • 另外,使用 std::string。
  • @user3159253: std::vector 不要求其元素是默认可构造的。
  • @Ben,也许构造函数打算打开一个文件,而ifstream::open 期望char * ..:)
  • @Matt McNabb 这已在 c++11 中修复,您始终可以使用 std::string::c_str() 转换为以零结尾的 const char *。 (另外,使用 const 正确性);)

标签: c++ c++11 constructor default-constructor


【解决方案1】:

这取决于您希望 ReadConfigParams 类的客户端如何实例化此类的对象。

如果 ReadConfigParams 类总是需要文件名(在大多数情况下),则不应定义默认构造函数,因为在没有关联文件的情况下实例化 ReadConfigParams 是没有意义的。这将有效地防止客户端在没有给定文件名的情况下创建此类的对象。

但是如果类 ReadConfigParams 可以提供一些默认配置值,那么你应该定义一个默认构造函数。这将使此类的客户端能够实例化并因此访问默认值而无需文件读取操作。

【讨论】:

    【解决方案2】:

    通常,如果您不为类声明默认构造函数,编译器会为您提供一个。

    但是,请注意,只有在您不提供任何构造函数时,编译器才会创建默认构造函数。对于您的示例,您提供了一个带有一个参数的构造函数,然后编译器将为您创建默认构造函数。

    示例 1:

    class A
    {
    };
    
    int main() 
    {
        A a; // OK, as the compiler creates one for you
    }
    

    示例 2:

    class A
    {
    public:
        A(int){}
    };
    
    int main() 
    {
        A a; // NOT OK, error: no appropriate default constructor available!
    }
    

    示例 3:

    class A
    {
    public:
        A(){}
        A(int){}
    };
    
    int main() 
    {
        A a; // OK, as you explicitly provide one default constructor
    }
    

    另外,根据“C++11 – ISO-IEC 14882-2011”§8.5/6:

    如果程序调用 const 限定类型 T 的对象的默认初始化,T 应是具有用户提供的默认构造函数的类类型。

    您可以查看this thread 了解更多信息。

    【讨论】:

      【解决方案3】:

      问题如果我们使用参数构造函数,我们是否需要在c++中提供默认构造函数?

      答案视情况而定。

      如果你想创建一个对象数组,你必须提供一个默认构造函数。

      ReadConfigParams array[10];
      

      如果您没有默认构造函数,则将无法使用。同样,您不能使用operator new 分配对象数组。

      ReadConfigParams* arrayPtr = new ReadConfigParams[10];
      

      也不行。

      如果您不需要在堆栈或堆中创建数组,则不提供默认构造函数即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 2016-07-27
        • 2015-04-20
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 2021-05-25
        相关资源
        最近更新 更多