空体的 C++ 函数与没有体的函数

标签 c++ function

我试图理解没有 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/

相关文章:

c++ - 在 C++ 中初始化位域结构的最佳方法是什么?

c++ - printf 跳过字符数组的第一个字符

在 C 中即时更改标准输出(putch() 函数)

r - 使用mutate时,较长的对象长度不是较短的对象长度的倍数

Python:如何将数据帧中的纬度/经度坐标传递或循环到函数中

javascript - 如何引用传递给函数的另一个参数的 "this"?

c++ - 创建指针是否使用大量资源?

c++ - 交通标志检测与识别

c++ - 在现代 C++ 中优雅地定义多维数组

c - 如何将字符串传递给C中的函数