我试图理解没有 body 和空 body 之间的区别,如这两个功能:
void draw() const override;
void rotate(int angle) override {}
完整代码如下所示,其中Shape
是一个接口(interface),Circle
是该接口(interface)的实现。
#include<iostream>
#include<vector>
using namespace std;
class Point {
public:
double x() {
return x_coordinate;
}
double y() {
return y_coordinate;
}
private:
double x_coordinate, y_coordinate;
};
class Shape {
public:
virtual Point center() const =0;
virtual void move(Point to) =0;
virtual void draw() const =0;
virtual void rotate(int angle) =0;
virtual ~Shape() {}
};
class Circle: public Shape {
public:
Circle(Point p, int radius);
Point center() {
return c;
}
void move(Point to) {
c = to;
}
void draw() const override;
void rotate(int angle) override {}
private:
Point c;
int r;
};
最佳答案
函数声明告诉编译器调用函数所需知道的一切。有了这些信息,编译器可以生成中间文件,例如“obj”文件。
一旦代码被编译,下一步就是链接它,在链接过程中,链接器必须将代码的实际位置放入最终的 exe 中。这是函数定义的来源,如果链接器找不到函数定义,您将收到错误消息。
您可以将函数声明与定义分开,这是常见的做法,因为它有助于加快编译速度、使文件清晰易读以及其他一些优点。
所以:
void draw() const override;
是一个声明,告诉编译器它需要调用它什么,但是没有足够的信息来真正跳转到代码(因为根本就没有代码)。
void rotate(int angle) override {}
既是声明又是定义。这为编译器提供了足够的信息来调用它,并为链接器提供了足够的信息以跳转到实际代码。 “{}”有一点隐含代码,会扩展为类似以下内容:
void rotate(int angle) override {return;} // do nothing and return
对于类,事情变得有点模糊,但这些基本规则始终适用于每个函数,无论它们是模板、类,还是只是普通的旧 C 风格代码。
关于空体的 C++ 函数与没有体的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67776093/