在 C++ 中创建默认构造函数
Create a default constructor in C++
这可能是
一个愚蠢的问题,但我在网上找不到很多关于在C++中创建自己的默认构造函数的信息。 它似乎只是一个没有参数的构造函数。 但是,我尝试像这样创建我的默认构造函数:
Tree::Tree() {root = NULL;}
我也尝试了一下:
Tree::Tree() {}
当我尝试其中任何一个时,我收到错误:
重载函数"Tree::Tree"的任何实例都与指定的类型匹配。
我似乎无法弄清楚这意味着什么。
我正在我的.cpp
文件中创建此构造函数。 我也应该在我的头文件(.h
)文件中做点什么吗?
成员函数(包括构造函数和析构函数)必须在类定义中声明:
class Tree {
public:
Tree(); // default constructor
private:
Node *root;
};
然后,您可以在.cpp文件中定义它:
Tree::Tree() : root(nullptr) {
}
我为C++11投入了nullptr
。如果没有 C++11,请使用 root(0)
。
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
}
为
任何成员函数创建定义是不够的。您还需要声明成员函数。这也适用于构造函数:
class Tree {
public:
Tree(); // declaration
...
};
Tree::Tree() // definition
: root(0) {
}
作为旁注,您应该使用成员初始值设定项列表,而不应使用 NULL
。在 2011 C++中,您希望将nullptr
用于后者,在 2003 C++中使用 0
。
是的,您需要在标头中声明它。 例如,将以下内容放在树类的声明中。
class Tree {
// other stuff...
Tree();
// other stuff...
};
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 具有非默认构造函数的单例类
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 在C++中使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数的情况下创建的派生对象
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 创建类类型的动态分配数组,其中类不得具有默认构造函数