我将代码简化为两个独立编译并链接在一起的文件。
文件: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生成的目标文件,第一种情况是空的,所以它不会链接是正常的,但为什么呢?
classA.cpp 中显示的代码是类 A 的声明,其中包含构造函数的内联定义。当你将 classA.o 和 main.o 连接在一起时,你就会重复声明 A 类。
A::A(int _a){...} 另一方面只是构造函数的定义,它补充了 main.cpp 中的类声明