Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;具有构造函数定义但没有代码的类在何处实现?_C++_Class_Copy Constructor_Function Declaration - Fatal编程技术网

C++ c++;具有构造函数定义但没有代码的类在何处实现?

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

我在一个.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文件

中。 所以,任何人都可以解释为什么这段代码会编译,为什么只包含函数声明而不包含函数实现


谢谢

如果函数已定义但未使用,则代码将编译。如果它们已定义且从未使用过,则优化程序将删除它们。但是,如果使用它们,则会出现链接器错误

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


尽管如此,克里斯在评论中提出了一个很好的观点。如果您不希望人们使用默认函数,那么它可能会很有用。这也是为什么它位于私有部分,而像
copy
=
这样的内容通常应该公开

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

作者明确禁止复制构造和赋值

如果在外部使用,它将是一个错误(因为它是私有的)。如果它被内部引用或被朋友引用,那么它将产生一个链接错误,因为该定义不存在

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

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

在这里,编译器将在编译时注意到这一点-没有链接器错误,并且在没有其他文档的情况下明确了意图:)

可能不允许使用它们。最好的方法是
=delete
。您使用了错误的单词-声明了赋值运算符和复制构造函数。谢谢,这有助于澄清问题。请注意,这也可以通过使用boost::noncopyable来实现,这一点IMHO也更清楚。@Joel yup+1。OP中的程序也可能是OP正在使用的程序中使用的
noncopyable
类型。我同意你的观点,特别是因为类用于继承。谢谢你的回答