我正在审查我的决赛,我无法弄清楚为什么这个问题是什么.
假设以下类声明:
class Testing {
public:
Testing(int n);
void Show(const Testing& w, int a = 10);
int value;
private:
int DoThis();
};
Run Code Online (Sandbox Code Playgroud)
假设以下代码行正在main()程序中尝试,并且x是类型Testing并且已经过属性创建.
x.Show(18); 合法或非法
答案是合法的,我明白第二个参数是不需要的= 10,但因为18不是类型Testing不是一个无效的参数?
Eti*_*tel 16
测试有一个非explicit构造函数,它接受一个int.因此,可以Testing通过构造临时对象将int隐式地转换为a .
由于Show采用const Testing &(而不仅仅是a Testing &),您可以将临时传递给它.最后,第二个参数是可选的,因此您不必为此指定值.
顺便说一句,整个机制允许你这样做:
void f(const std::string &str);
// ...
f("Hello");
Run Code Online (Sandbox Code Playgroud)
在这里,"Hello"是一个类型的const char (&)[6],其衰减到const char *,但是你可以构造一个std::string从const char *,从而允许使用的const char *其中一个std::string需要的参数.
请记住,这构造了一个临时的,因此仅对通过值或const引用传递的参数有效(对于引用将失败).此外,不能将构造函数标记为explicit.
因为Testing有一个接受a的构造函数int,该c-tor用于自动构造Testing第一个参数的对象.代码实际上最终工作如下:
x.Show(Testing(18));
Run Code Online (Sandbox Code Playgroud)