【问题标题】:Create a default constructor in C++在 C++ 中创建默认构造函数
【发布时间】:2012-11-03 08:53:39
【问题描述】:

这可能是一个愚蠢的问题,但我在网上找不到很多关于在 C++ 中创建自己的默认构造函数的信息。它似乎只是一个没有参数的构造函数。但是,我尝试像这样创建我的默认构造函数:

Tree::Tree()  {root = NULL;}

我也试过了:

Tree::Tree() {}

当我尝试其中任何一个时,我都会收到错误:

没有重载函数“Tree::Tree”的实例与指定的类型匹配。

我似乎无法弄清楚这意味着什么。

我正在我的.cpp 文件中创建这个构造函数。我也应该在我的标头 (.h) 文件中做些什么吗?

【问题讨论】:

    标签: c++ default-constructor


    【解决方案1】:

    是的,您需要在标题中声明它。例如,将以下内容放在树类的声明中。

    class Tree {
        // other stuff...
        Tree();
        // other stuff...
    };
    

    【讨论】:

    • 谢谢!我知道是这样的。我想我需要多学习一点关于头文件的知识。
    【解决方案2】:

    成员函数(包括构造函数和析构函数)必须在类定义中声明:

    class Tree {
    public:
        Tree(); // default constructor
    private:
        Node *root;
    
    };
    

    然后你可以在你的 .cpp 文件中定义它:

    Tree::Tree() : root(nullptr) {
    }
    

    我为 C++11 提供了 nullptr。如果您没有 C++11,请使用 root(0)

    【讨论】:

    • 谢谢!我之前读过类定义,但不知道这意味着什么,所以我可能忽略了它。现在它更有意义了。
    • 每个类都必须有一个定义。该定义列出了该类的成员函数和成员数据。无论您在何处使用该类,您的代码都必须查看类定义。所以类定义几乎总是进入一个头文件,你可以在任何使用该类的源文件中#include。在定义成员函数的源文件或文件中,您还#include 头文件,然后编写函数定义。
    【解决方案3】:

    为任何成员函数创建定义是不够的。您还需要声明成员函数。这也适用于构造函数:

    class Tree {
    public:
        Tree(); // declaration
        ...
    };
    
    Tree::Tree() // definition
        : root(0) {
    }
    

    附带说明,您应该使用成员初始化器列表,并且您应该使用NULL。在 C++ 2011 中,您希望对后者使用 nullptr,在 C++ 2003 中使用 0

    【讨论】:

    • 谢谢!我就是这么想的,但不知道如何声明。
    【解决方案4】:

    C++11 允许您像这样定义自己的默认构造函数:

    class A {  
        public:
            A(int);        // Own constructor
            A() = default; // C++11 default constructor creation
    };
    
    A::A(int){}
    
    int main(){
        A a1(1); // Okay since you implemented a specific constructor
        A a2();  // Also okay as a default constructor has been created
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-29
      • 2018-10-02
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2014-03-26
      相关资源
      最近更新 更多