C++类问题

dub*_*yaa 6 c++ class

我正在审查我的决赛,我无法弄清楚为什么这个问题是什么.

假设以下类声明:

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::stringconst char *,从而允许使用的const char *其中一个std::string需要的参数.

请记住,这构造了一个临时的,因此仅对通过值或const引用传递的参数有效(对于引用将失败).此外,不能将构造函数标记为explicit.


Mar*_*wis 6

C++中有一种自动转换的概念,称为隐式转换序列.在这样的序列中,最多一次转换可以是用户定义的转换,并且为临时对象调用构造函数是用户定义的转换.这是确定在这里创建一个临时的,将被绑定到常量参考,并摧毁了展()调用完成时.


Tha*_*tos 5

因为Testing有一个接受a的构造函数int,该c-tor用于自动构造Testing第一个参数的对象.代码实际上最终工作如下:

x.Show(Testing(18));
Run Code Online (Sandbox Code Playgroud)