C++ c++;具有构造函数定义但没有代码的类在何处实现?
我在一个.h文件中有以下类:C++ c++;具有构造函数定义但没有代码的类在何处实现?,c++,class,copy-constructor,function-declaration,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
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文件中。
所以,任何人都可以解释为什么这段代码会编译,为什么只包含函数声明而不包含函数实现
谢谢 如果函数已定义但未使用,则代码将编译。如果它们已定义且从未使用过,则优化程序将删除它们。但是,如果使用它们,则会出现链接器错误 定义一个函数而不填写它是不好的做法。特别是如果其他人将要使用此代码
尽管如此,克里斯在评论中提出了一个很好的观点。如果您不希望人们使用默认函数,那么它可能会很有用。这也是为什么它位于私有部分,而像
copy
或=
这样的内容通常应该公开 如果显式定义构造函数,则禁用所有其他隐式构造函数。因此,这会产生影响,并在许多情况下有用。但是,我认为没有理由定义析构函数并将其留空(析构函数甚至没有声明为虚拟的)。作者明确禁止复制构造和赋值
如果在外部使用,它将是一个错误(因为它是私有的)。如果它被内部引用或被朋友引用,那么它将产生一个链接错误,因为该定义不存在
在C++11中,更清楚地写为:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
在这里,编译器将在编译时注意到这一点-没有链接器错误,并且在没有其他文档的情况下明确了意图:)可能不允许使用它们。最好的方法是
=delete
。您使用了错误的单词-声明了赋值运算符和复制构造函数。谢谢,这有助于澄清问题。请注意,这也可以通过使用boost::noncopyable来实现,这一点IMHO也更清楚。@Joel yup+1。OP中的程序也可能是OP正在使用的程序中使用的noncopyable
类型。我同意你的观点,特别是因为类用于继承。谢谢你的回答