所以我一直在阅读这篇文章,但找不到任何可以解释下面这段代码的行为给我: header.hpp:
class TESTING{
private:
int num;
public:
TESTING(int);
};
void testing(int, int);
def.cpp:
#include "header.hpp"
#include <iostream>
using namespace std;
TESTING::TESTING(int num = 100){
this->num = num;
cout << "init with: " << this->num << endl;
}
void testing(int a = 500, int b = 200){
cout << "a: " << a << ", b: " << b << endl;
}
int main(){
TESTING test1;
TESTING test2(5);
testing();
testing(1);
testing(1, 2);
}
到目前为止,这么好并按预期工作,输出是:
init:100
初始化:5
a:500,b:200
a:1,b:200
a:1,b:2
但是当我剪切“int main”函数并将其粘贴到下面的Main.cpp中时
Main.cpp的:
#include "header.hpp"
int main(){
//TESTING test1;//error: assumed to be default constructor
TESTING test2(5);
//testing();//error: too few arguments
//testing(1);//error: too few arguments
testing(1, 2);
}
我会收到上面评论中提到的错误,但仍然是输出:
init:5
a:1,b:2
这意味着它确实将自己链接到def.cpp但具有某种最小可见性(?)。
为什么会这样?
这个Main.cpp文件的目的是拥有一个主要功能,它将运行该项目中的所有其他c ++文件,是否有一种一般更好的方法来实现这一目标我试过了?如果是这样,这种方式是否适用于此处提到的代码?或者我的代码写的很糟糕?
答案 0 :(得分:3)
默认参数不会跨源文件进行神奇传输。想想看 - 编译器处理main.cpp怎么会知道,在不同的源文件中,你给某些参数提供了默认参数?
形式上,默认参数特定于任何给定范围:
8.3.6 / 4 对于非模板函数,可以在稍后的同一范围内的函数声明中添加默认参数。声明 不同的范围有完全不同的默认参数集......
即使在同一个源文件中,也可以声明相同的函数在不同的范围内具有不同的默认参数。编译器很乐意替换当前作用域中可见的声明指定的任何默认参数(如果有的话)。
在一个不相关的说明中,单词&#34; link&#34;是一个艺术术语 - 它在C ++中具有非常特殊的含义。这种联系的概念在很大程度上与你的问题无关,至少在与默认论证有关的范围内(我只是为了可能被问题的标题混淆的读者的利益而指出)。默认参数集不是函数名称或签名的一部分,并且不会影响其链接,它可以跨范围和翻译单元使用。