类定义和类声明

时间:2013-06-02 13:44:24

标签: c++ class

我正在阅读编程原理并使用c ++实践(Bjarne Stroustrup),

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

1

  

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

2

  

除非您知道......

,否则不要将成员函数体放在类声明

作者写错了吗?它谈到同样的事情,为什么第一句话是“阶级定义”,第二句话是“阶级宣言”?

感谢

3 个答案:

答案 0 :(得分:7)

  

作者写错了吗?

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

class X;

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

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

class X
{
    // ...
};

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

在常识假设下,句子是错误的,通过声明我们的意思是声明不是定义,但在处理这些术语时,可能是最好记住他们的正式定义。

答案 1 :(得分:0)

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

答案 2 :(得分:-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
}

或者像这样的类declration:

   class X {
      void test () {
         //test code
      }

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

<强> What is the difference between a definition and a declaration?

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

以下是关于你应该分开的原因的另一个广泛讨论:

<强> Is is a good practice to put the definition of C++ classes into the header file?