为什么类定义以一种方式编译而不是另一种方式?

问题描述 投票:0回答:1

我将代码简化为两个独立编译并链接在一起的文件。

文件:main.cpp

class A{
    public:
        int value;
        A(int);
};

#include <iostream>
using namespace std;

int main(int argc, char **argv)
{ A a{7};
    cout<<"a.value="<<a.value<<endl;
    return 0;
}

文件:classA.cpp

class A{
    public: 
        int value;
        A(int x):value{x}{};
};

//A::A(int x):value{x}{}

根据我对该过程的理解,当编译classA.cpp时,会创建一个函数“A::A”(该类的构造函数)。 如果我注释行 A(int x):value{x}{} 并取消注释注释行,则目标文件中的结果应该是相同的。

但是在第一种情况下,两个目标文件不会链接在一起,而在另一种情况下,它们会链接在一起。 这是为什么?

我检查了为classA生成的目标文件,第一种情况是空的,所以它不会链接是正常的,但为什么呢?

c++ class g++ object-files
1个回答
0
投票

classA.cpp 中显示的代码是类 A 的声明,其中包含构造函数的内联定义。当你将 classA.o 和 main.o 连接在一起时,你就会重复声明 A 类。

A::A(int _a){...} 另一方面只是构造函数的定义,它补充了 main.cpp 中的类声明

© www.soinside.com 2019 - 2024. All rights reserved.