我正在阅读编程原理并使用c ++实践(Bjarne Stroustrup),
9.4.4定义成员函数,第312页,它说
1
在类定义中编写成员函数的定义有两个效果......
2
除非您知道......
,否则不要将成员函数体放在类声明中
作者写错了吗?它谈到同样的事情,为什么第一句话是“阶级定义”,第二句话是“阶级宣言”?
感谢
答案 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? 强>