类定义和类声明 我用C++(Bjarne Stroustrup),阅读编程原理和实践

类定义和类声明 我用C++(Bjarne Stroustrup),阅读编程原理和实践,c++,class,C++,Class,9.4.4定义成员功能,第312页,它说 一, 在类定义中写入成员函数的定义有两个效果 二, 不要将成员函数体放入类声明中,除非您知道 作者写错了吗?它讲的是同一件事,为什么第一句是“类定义”,第二句是“类声明” 谢谢 作者写错了吗 没有错,但不精确。类声明可以是转发声明,例如: class X; class X { // ... }; 这只会使编译器知道该类的存在,但不会指定该类有哪些成员、基类等(这就是类定义的作用) 但是,声明也可以是定义,例如: class X; class

9.4.4定义成员功能,第312页,它说

一,

在类定义中写入成员函数的定义有两个效果

二,

不要将成员函数体放入类声明中,除非您知道

作者写错了吗?它讲的是同一件事,为什么第一句是“类定义”,第二句是“类声明”

谢谢

作者写错了吗

没有错,但不精确。类声明可以是转发声明,例如:

class X;
class X
{
    // ...
};
这只会使编译器知道该类的存在,但不会指定该类有哪些成员、基类等(这就是类定义的作用)

但是,声明也可以是定义,例如:

class X;
class X
{
    // ...
};
因此,从某种意义上说,既然定义也是一种声明,那么这个句子就没有错


根据常识假设,这个句子可能是错误的,即声明指的是不是定义的声明,但在处理此类术语时,最好记住它们的正式定义。

类声明就是声明类的地方。或作为

从C++标准3.1节:

声明将名称引入翻译单元或重新声明 由以前的声明引入的名称。声明指定了 这些名称的解释和属性

本质上,声明告诉编译器存在具有特定名称的特定对象、变量等。在一个编译单元中可以有多个声明

所以在某种程度上

class X; // is declaration also known as forward declaration.
这只是一个声明。 但是,每个对象/变量必须始终只有一个定义。 定义基本上就是编译器创建类/对象/结构/变量等实例所需的一切

在C++中,一个类声明也可以是一个定义或部分定义/< /p>
//declare a class and declare it's members.
class X { //declares X and starts to define it
   void test ();  //declare test method
   int b;         // declare b member
}
完整定义可以在.cpp文件中,如下所示:

void X::test() {
  //test code
}
   class X {
      void test () {
         //test code
      }
或者在课堂上这样说:

void X::test() {
  //test code
}
   class X {
      void test () {
         //test code
      }
以下是关于差异的广泛讨论:

<>我相信作者建议不要使用声明类和定义类定义方法的第二类声明,而是在一个单独的C++文件中。这是因为C++定义的只有一个规则,所以不希望从多个文件中包含相同的.h文件,并且对于同一个类有多个定义。 下面是关于为什么要分开的另一个广泛讨论:


从OOP语言的不同角度来看,接口意味着用她的方法声明类。在C++中,你可以把它放在一些头文件中。类的实现意味着该类方法的实现。例如,在Java中,您可以使用一个抽象类,其中一些方法是实现的,而另一些则不是。但是抽象类或接口不能实例化。

作者在类定义中定义成员函数时谈到了哪些缺陷?仅供参考,这样做对类模板来说是必要的。是的……撇开行话怪癖不谈,这听起来像是个坏建议。在
类{}
块中定义函数没有错;这通常是实现
inline
函数最清晰的方法。对于类模板的非模板朋友(不常见)情况,必须在该范围内定义它。@Praetorian-类模板不需要在类定义内定义成员函数。这是一种常见的样式,使代码看起来非常像Java。但一般来说,没有什么可以阻止在模板定义之外用适当的限定名定义成员函数。@PeteBecker-True;但我指的是将定义与源文件和头文件中的声明分离,这在类模板的情况下是无法做到的(除非您还包含源文件)。但是类定义也可以是类声明,对吗?例如,[class.name]/2“仅由类键标识符组成的声明;是当前作用域中名称的重新声明或标识符作为类名的转发声明。”因此,如果类声明包含类说明符/类定义,则可以将函数体放在类声明中。这是完全错误的。您的示例是转发声明。一般而言,声明可以是远期声明或定义。引用的作者并不是绝对错误,只是毫无道理地不精确。@DyP:是的,严格来说,你是对的。我是在常识的假设下,我们所说的“声明”是指“声明,它不是一个定义”,但事实上,这不一定是一个正确的假设。我编辑了答案,谢谢you@Potatoswatter你说得对。正如我在上面的评论中所写,我是在做一个常识性的假设,这在处理正式术语时是不太合适的。我编辑了答案,谢谢我没有否决,但是成员函数的定义不是类定义的一部分。函数体可能出现在类定义中,但这并不意味着它是定义类所需的一部分。我同意,声明某些东西意味着你拥有创建它的所有信息。因此,本质上你不需要声明方法来创建类实例。但是,很多时候,当把它们放在同一个地方,而不是拆分为header和cpp时,您会遇到问题:)不,
classx
X
的完美声明。声明IMO是一个名称的介绍,包含理解该名称所指内容的所有必要信息(它是变量、类型、函数吗