我在单个.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文件中找到了
那么,任何人都可以解释为什么这个代码会编译,为什么你只包含一个函数的声明而不是它的实现呢?
谢谢!
答案 0 :(得分:3)
作者明确禁止复制构造和作业。
如果在外部使用,则会出错(因为它是private
)。如果它在内部引用或由friend
引用,那么它将产生链接错误,因为该定义不存在。
在C ++ 11中,这更清楚地写成:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
在这里,编译器会在编译时注意到这一点 - 没有链接器错误和明确的意图而没有其他文档:)
答案 1 :(得分:0)
如果定义了函数但未使用,则代码将编译。如果它们已定义且从未使用过,则优化器将删除它们。但是,如果使用它们,那么您将收到链接器错误。
定义一个函数而不是填写函数是不好的做法。特别是如果其他人将要使用此代码。
虽然克里斯在评论中提出了一个很好的观点。如果您不希望人们使用默认功能,这可能很有用。这也是为什么它位于私人部分,当copy
或=
之类的内容应该公开时。
答案 2 :(得分:0)
如果明确定义构造函数,则禁用所有其他隐式构造函数。所以这有影响,在很多情况下都很有用。但是,我认为没有理由定义并将析构函数留空(它甚至不被声明为虚拟)。