具有类的库如何工作?

时间:2013-02-12 19:48:51

标签: c++ libraries

在学校学习C ++时,我们从未真正谈过如何建立图书馆,对于我的基本理解感到遗憾。 从我在网上看到的,似乎一个库只是已编译的代码集合,然后有一个.h文件列出了该库中可访问的函数。

例如,当我#include <cmath>时,我现在可以调用sin(x)而无需访问cmath代码来编译它。我的问题是,这是否适用于包含数据的类。

我可以创建一个库

//AccumulatorLibrary.h
class Accumulator
{
public:
    int num;
    int increment() {num++};
    void otherFunctions(); //otherFunctions defined in the .lib file
}

然后叫它

//Main
#include "AccumulatorLibrary.h"
#include <stdio>
int main()
{
    Accumulator A(0); //initalize num to 0
    Accumulator B(7); //initalize num to 7
    cout<<A.increment;
    cout<<B.increment;
    cout<<A.increment;
}

获得1 8 2的输出?

总之,如果我弄清楚如何将一堆类放入库文件中,我可以访问我想要的任何数据,只要该数据在.h文件中具有访问功能吗?

或者一个更基本的问题,.h.lib文件的工作方式与常规c ++代码完全相同,只是在使用它时不需要编译,而且你不要是否可以访问.lib文件中的代码?

2 个答案:

答案 0 :(得分:5)

  

从我在网上看到的,似乎一个库只是已编译的代码集合,然后有一个.h文件列出了该库中可访问的函数。

正确。

  

我的问题是,这是否适用于包含数据的类。

确实如此。许多C ++库都公开了类,并在库中预编译了代码。

  

或者更基本的问题,.h和.lib文件的工作方式与常规c ++代码完全相同,只是在使用它时不需要编译...

等等,等等。 .h文件仍然包含C ++代码(声明,有时甚至是内联实现)。 .lib文件是动态链接库。它们是C ++源文件的编译(和链接)的结果。

  

...并且您无权访问.lib文件中的代码?

您可以访问它:使用反汇编程序打开它。它不再是C ++了。

答案 1 :(得分:1)

  

从我在网上看到的内容来看,它似乎只是一个图书馆   已编译的代码集合

是和否。

对我而言,“库”是一个代码体(一个或多个标题(.h)文件和零个,一个或多个源(.cpp)文件),没有{{1函数,可以独立编译和链接(main()除外)。

可以使用各种机制提供库:

  • 作为来源提供:您必须在此处编译库以及您的应用程序。例如C ++标准模板库,Boost C ++库,您或您的同事编写的库,您从sourceforge下载的库等。(警告:有时基于源的库可以在系统中作为编译优化进行预编译。 )

    请注意,作为源提供意味着您可以阅读它,但不一定要修改它。

  • 以二进制形式提供:此处,库已经编译,可能在您的系统中可用。例如C标准库,C ++标准库,C数学库等。从这个问题来看,听起来这就是你所指的那个。

  

然后有一个.h文件,列出了可以访问的功能   那个图书馆。

是的,就是C库的情况。对于C ++,概念自然扩展为包括类和(公共)成员函数。

  

总之,如果我弄清楚如何将一堆类放入一个   库文件可以访问我想要的任何数据,只要该数据有   .h文件中的访问功能?

是!

  

或者更基本的问题,.h和.lib文件的工作方式完全相同   作为常规c ++代码,除了它不必在何时编译   你使用它,并且你无法访问.lib文件中的代码吗?

库遵循相同的C ++规则,如上所述,唯一的区别是它没有main()函数。

是否需要编译取决于您可以使用的方式(见上文)。

对于许多库,您可以访问源代码(参见上文)。

以下是您示例的完整代码:

main()