2010-12-08 111 views
6

我正在审查我的最后,我不明白为什么这个问题是什么。C++类问题

假定以下类声明:

class Testing { 
public: 
     Testing(int n); 
     void Show(const Testing& w, int a = 10); 
     int value; 
private: 
     int DoThis(); 
}; 

假定以下行的代码试图在一个main()程序,和x是Testing型的,并已propertly创建。

x.Show(18);合法或非法

答案是合法的,据我所知,是没有必要,因为= 10的第二个参数,但由于18不是Testing类型的不是一个无效的参数?

回答

16

测试有一个非 - explicit构造函数,它接受一个int。因此,通过构造一个临时对象,可以将int隐式转换为Testing

因为Show需要const Testing &(而不仅仅是Testing &),所以您可以传递临时文件给它。最后,第二个参数是可选的,所以你不必为它指定一个值。

这整个机制是什么让你这样做,顺便说一句:

void f(const std::string &str); 
// ... 
f("Hello"); 

这里,"Hello"const char (&)[6]类型,其衰减到const char *的,但你可以从const char *构建std::string,从而允许使用const char *,其中需要std::string参数。

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

+0

谢谢,有几个很好的答案,但这是非常彻底的。感谢您花时间给我一个解释。 – dubyaa 2010-12-08 21:23:10

3

的此处构造:

Testing(int n); 

提供从intTesting的隐式转换,并且这然后匹配的原型为Show,与所述第一参数不同于所述int 18构成的Testing实例,并且第二参数是默认值10

如果防止这样的隐式转换:

explicit Testing(int n); 

代码不会编译。

5

由于Testing有一个接受int的构造函数,因此该C-tor用于为第一个参数自动构造一个Testing对象。该代码实际上最终工作是这样的:

x.Show(Testing(18)); 
6

有一个在C++自动转换,称为implicit conversion sequences的概念。在这样的序列中,最多一次转换可能是用户定义的转换,并且调用临时对象的构造函数是用户定义的转换。可以在这里创建一个临时的,因为它会绑定到const引用,并在Show()调用完成时被销毁。