为什么方法定义是可选的?

时间:2014-02-02 10:37:18

标签: c++ methods

我不确定此代码是如何工作的。根据我的理解,应该定义所有声明的方法。

class Test
{
public:
void foo();
};

int main()
{
Test t;
return 0;
}

在类Test中,方法foo()已声明但未定义,但此代码仍可正常工作。请解释为什么这样做。这样做是不是错误,因为只有声明的方法没有用,除非它是在抽象类或接口中?我的猜测是方法的声明告诉编译器它,所以编译器不会抱怨它,它会正常工作,直到有人真正尝试使用此方法。如果是这样,那么为什么允许这样做仍然没有意义?是否有任何具体原因或用途?

2 个答案:

答案 0 :(得分:5)

编译器不会抱怨这样的代码,因为它不能 - 你可以在其他文件中编写函数定义。只有链接器可以告诉您所有文件中都没有函数定义。但是因为你根本没有使用过那个函数,所以没有引用这个函数,链接器也不会抱怨。

答案 1 :(得分:1)

它“有效”,因为没有任何东西调用函数Test::foo

编译器无法知道是否要在当前编译单元[1]中定义Test,或者有test.cpp实现函数Test::foo。因此,编译器必须接受您不在此处定义函数。

如果你有两个文件,一个有main,一个有Test::foo,那么当编译器采用所有不同的文件时,它会在编译的后期链接阶段合并您的软件包含的组件并将它们组合在一起。这可能是你学习过程中的“未来”,但这就是编译器“现在”不抱怨它的原因。并且由于您实际上并未尝试使用函数Test::foo,因此实际上存在“不需要”,因此不会产生错误。

[1]请注意,如果主文件中有class Test,或者test.h中包含#include,则实际编译器并不重要,因为{{1}}部分在编译器实际尝试“理解”代码之前处理。

编辑:当然有人可能会认为这段代码是无稽之谈。声明未使用的函数有什么意义。但这并不是编译器/链接器决定的。如果您不使用某些东西,则无需定义它。这些是规则。