我正在阅读使用 c++ (Bjarne Stroustrup) 的编程原理和练习,
9.4.4 定义成员函数,第 312 页,它说
1.
在类定义中编写成员函数的定义有两个效果......
2.
不要将成员函数体放在类声明中,除非你知道......
作者写错了吗?它讲的是同一件事,为什么第一句是“类定义”,第二句是“类声明”?
谢谢
作者写错了吗?
没有错,但不准确。类声明可以是前向声明,例如:
class X;
这只是让编译器知道该类的存在,但没有指定该类具有哪些成员,哪些基类等等(这就是类定义所做的)。
但是,声明也可以是定义,例如:
class X
{
// ...
};
所以从某种意义上说,既然定义也是声明,那么这句话就没有错。
在常识假设下,这句话是错误的,即声明是指不是定义的声明,但是在处理此类术语时,最好记住它们的正式定义。
从 OOP 语言的不同角度来看,接口意味着用她的方法声明类。在 C++ 中,您可以将其放在某个头文件中。类的实现就是这个类的方法的实现。例如,在 Java 中,您可以使用一个抽象类,其中一些方法已实现,而另一些则没有。然而抽象类或接口不能被实例化。
类声明是您声明类的地方。或作为
从 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 文件并且对同一个类有多个定义。
这是关于为什么要分开的另一个广泛讨论: