gpt4 book ai didi

c++ - C++ 头文件如何包含实现?

转载 作者:IT老高 更新时间:2023-10-28 13:22:05 24 4
gpt4 key购买 nike

好吧,无论如何都不是 C/C++ 专家,但我认为头文件的重点是声明函数,然后 C/CPP 文件定义实现。

但是,今晚查看一些 C++ 代码时,我在一个类的头文件中发现了这个...

public:
UInt32 GetNumberChannels() const { return _numberChannels; } // <-- Huh??

private:
UInt32 _numberChannels;

那么为什么在 header 中有实现呢?它与 const 关键字有关吗?这是否内联类方法?与在 CPP 文件中定义实现相比,这样做的好处/要点是什么?

最佳答案

Ok, not a C/C++ expert by any means, but I thought the point of a header file was to declare the functions, then the C/CPP file was to define the implementation.

头文件的真正目的是在多个源文件之间共享代码。它通常用于将声明与实现分开,以便更好地管理代码,但这不是必需的。可以编写不依赖于头文件的代码,也可以编写仅由头文件组成的代码(STL 和 Boost 库就是很好的例子)。请记住,当 预处理器 遇到 #include 语句时,它会将语句替换为被引用文件的内容,然后 编译器 只看到完成的预处理代码。

因此,例如,如果您有以下文件:

Foo.h:

#ifndef FooH
#define FooH

class Foo
{
public:
UInt32 GetNumberChannels() const;

private:
UInt32 _numberChannels;
};

#endif

Foo.cpp:

#include "Foo.h"

UInt32 Foo::GetNumberChannels() const
{
return _numberChannels;
}

Bar.cpp:

#include "Foo.h"

Foo f;
UInt32 chans = f.GetNumberChannels();

预处理器分别解析 Foo.cpp 和 Bar.cpp 并生成以下代码,然后由 编译器 解析:

Foo.cpp:

class Foo
{
public:
UInt32 GetNumberChannels() const;

private:
UInt32 _numberChannels;
};

UInt32 Foo::GetNumberChannels() const
{
return _numberChannels;
}

Bar.cpp:

class Foo
{
public:
UInt32 GetNumberChannels() const;

private:
UInt32 _numberChannels;
};

Foo f;
UInt32 chans = f.GetNumberChannels();

Bar.cpp 编译成 Bar.obj 并包含调用 Foo::GetNumberChannels() 的引用。 Foo.cpp 编译成 Foo.obj 并包含 Foo::GetNumberChannels() 的实际实现。编译后,链接器会匹配 .obj 文件并将它们链接在一起以生成最终的可执行文件。

So why is there an implementation in a header?

通过在方法声明中包含方法实现,它被隐式声明为内联(还有一个实际的 inline 关键字也可以显式使用)。指出编译器应该内联一个函数只是一个提示,并不能保证该函数实际上会被内联。但是如果是这样,那么无论从哪里调用内联函数,函数的内容都会直接复制到调用站点,而不是生成 CALL 语句来跳转到函数并跳转回退出时调用者。然后,编译器可以考虑周围的代码,并在可能的情况下进一步优化复制的代码。

Does it have to do with the const keyword?

没有。 const 关键字只是向编译器表明该方法不会改变在运行时被调用的对象的状态。

What exactly is the benefit/point of doing it this way vs. defining the implementation in the CPP file?

如果使用得当,它通常可以让编译器生成更快、更优化的机器代码。

关于c++ - C++ 头文件如何包含实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14517546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com