10

我正在阅读使用 c++ (Bjarne Stroustrup) 的编程原理和练习,

9.4.4 定义成员函数,第 312 页,它说

1.

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

2.

不要将成员函数体放在类声明中,除非你知道......

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

谢谢

4

3 回答 3

13

作者写错了吗?

没有错,但不准确。类声明可以是前向声明,例如:

class X;

这只是让编译器知道该类的存在,但没有指定该类具有哪些成员,哪些基类等等(这就是类定义所做的)。

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

class X
{
    // ...
};

所以从某种意义上说,既然定义也是声明,那么这句话就没有错。

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

于 2013-06-02T13:45:37.227 回答
0

从 OOP 语言的不同角度来看,接口意味着用她的方法声明类。在 C++ 中,您可以将其放在某个头文件中。类的实现就是这个类的方法的实现。例如,在 Java 中,您可以使用一个抽象类,其中一些方法已实现,而另一些则没有。然而抽象类或接口不能被实例化。

于 2013-06-02T14:33:20.340 回答
-1

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

从 C++ 标准第 3.1 节:

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

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

所以在某种程度上

class X; // is declaration also known as forward declaration.

只是一个声明。但是,每个对象/变量必须始终只有一个且只有一个定义。定义基本上是编译器创建该类/对象/结构/变量等实例所需的一切。

在 c++ 中,很多时候类声明也可以是定义或部分定义/

//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
      }

这是关于差异的广泛stackoverflow讨论:

定义和声明有什么区别?

我相信作者建议您不要使用第二种类型的声明,其中您在类定义中声明和定义方法,而是在单独的 c++ 文件中。这是因为 C++ 只定义一次规则,您不希望包含来自多个文件的同一个 .h 文件并且对同一个类有多个定义。

这是关于为什么要分开的另一个广泛讨论:

将 C++ 类的定义放入头文件是一种好习惯吗?

于 2013-06-02T14:05:27.277 回答