带有构造函数定义的c ++类,但没有实现它的代码?

时间:2013-03-07 23:25:17

标签: c++ class copy-constructor function-declaration

我在单个.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文件中找到了

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

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

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

在这里,编译器会在编译时注意到这一点 - 没有链接器错误和明确的意图而没有其他文档:)

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

如果明确定义构造函数,则禁用所有其他隐式构造函数。所以这有影响,在很多情况下都很有用。但是,我认为没有理由定义并将析构函数留空(它甚至不被声明为虚拟)。