4

我在一个 .h 文件中有以下类:

class MyClass
{
protected:
   MyClass();
   ~MyClass();

private:
   MyClass(const MyClass&);
   MyClass& operator=(const MyClass&);
};

inline MyClass::MyClass()
{
}

inline MyClass::~MyClass()
{
}

令我困惑的是,没有实现MyClass(const MyClass&)复制构造函数和MyClass& operator=(const MyClass&)赋值运算符重载的代码。该类只有定义,但没有别的。

我在我正在分析的代码中看到了这一点,它编译得很好。我是 C++ 新手,在我见过的所有示例中,我都在类中找到了定义,在下面或在单独的 .cpp 文件中找到了实现

那么,任何人都可以解释为什么这段代码可以编译,为什么只包含函数的声明而不包含它的实现?

谢谢!!

4

3 回答 3

5

作者明确禁止复制构造和分配。

如果在外部使用,会报错(因为是private)。如果它被内部引用或被 a 引用friend,那么它将产生链接错误,因为定义不存在。

在 C++11 中,这更清楚地写成:

MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;

在这里,编译器将在编译时注意到这一点 - 没有链接器错误和明确的意图,无需额外的文档:)

于 2013-03-07T23:30:15.930 回答
0

如果函数已定义但未使用,则代码将编译。如果它们被定义并且从未使用过,优化器将删除它们。但是,如果使用它们,您将收到链接器错误。

定义一个函数而不填写它是不好的做法。特别是如果其他人将使用此代码。

虽然,克里斯在评论中提出了一个很好的观点。如果您不希望人们使用默认功能,它可能会很有用。这也是为什么它位于私人部分的原因,当某些东西像copy=应该正常公开时。

于 2013-03-07T23:28:02.580 回答
0

如果显式定义构造函数,则会禁用所有其他隐式构造函数。因此,这具有影响,并且在许多情况下都很有用。但是,我认为没有理由定义析构函数并将其留空(甚至没有声明为虚拟的)。

于 2013-03-07T23:28:48.337 回答