我对C ++比较陌生,所以我在Xcode中测试了一些东西,发现了一个非常奇怪的东西。 这是我的'Testing.h'文件
#ifndef Testing_h
#define Testing_h
class Testing{
private:
int a;
public:
Testing(int a=3);
void hey(int b);
};
#endif
这是我的'Testing.cpp'文件
#include "Testing.h"
Testing::Testing(int a){
a = 4;
}
最后,这是'main.cpp'文件
#include <iostream>
#include "Testing.h"
using namespace std;
int main(){
Testing a;
//Apparently not completing the definitions of every abstract methods in the class is not a problem
}
我只在'Testing.h'中声明了'void hey(int b)',但没有在'Testing.cpp'中定义它。所以我想知道编译器如何成功编译'main.cpp'而没有'void hey(int b)'的足够信息。提前谢谢!
答案 0 :(得分:4)
因为你永远不需要有hey()
的定义。
您可以通过调用来定义定义,例如:
a.hey(42);
您会发现链接器并不太高兴,因为hey
是未定义的引用。
答案 1 :(得分:0)
Testing a;//Apparently not completing the definitions of every abstract methods in the class is not a problem
您使用默认值a=3
定义了构造函数,但同时调用构造函数参数和类参数是不好的做法。
相反,你可以这样写:
//Testing.h
#ifndef Testing_h
#define Testing_h
using namespace std;
class Testing{
private:
int number;
public:
Testing(int a=3): number(a = 4){}//it's the same as your implementation in cpp file
void hey(int b);
int getNumber() {return number;}
};
#endif
//main.cpp
#include <iostream>
#include "Testing.h"
int main()
{
Testing object;
cout<<object.getNumber();// returns 4
return 0;
}
为什么hey
会编译?
在构建项目期间,编译器会通过验证语法将源代码转换为目标代码。在该过程之后,链接器检查由整个短语标记的定义。源代码是从提供的每个文件中编译的。链接器并不关心实现存在,只有在程序使用方法时才会查找它。因此即使没有实现hey
您的程序也会编译。
上次评论
不鼓励包含.cpp文件而是使用标头。有时您可能会自己进入导致编译器错误的相同函数的多个定义。