C ++显式构造函数

时间:2012-12-17 10:08:03

标签: c++ constructor explicit

我有一个包含2个构造函数的类。

   explicit MyClass(size_t num);
   template<class T> MyClass(T myObj);

每当我做

时我都想要
MyClass obj( 30 );

将调用第一个构造函数,

隐式构造函数和

MyClass obj = 30;

第二个ctor将被召唤。

我该如何实现?

2 个答案:

答案 0 :(得分:7)

30是有符号整数值,因此它不完全符合第一个构造函数的签名(因此,模板会被实例化)。

您可以更改显式构造函数的签名以接受int,而Myclass obj( 30 );将调用显式构造函数,或者使用30u调用它以便与显式匹配签名。

答案 1 :(得分:0)

关于第一个对象

MyClass obj (30);

这是直接初始化,因此,如果参数具有正确的参数类型,则应调用构造函数。在这种情况下,该参数是不正确的,因此在这种情况下,为了更加准确,我将size_t更改为unsigned int,然后将30u传递给该对象。在这种情况下,将调用第一个构造函数。 关于第二个对象

MyClass obj = 30;

这是通过副本初始化的,因此我将第二个构造函数更改为这样的副本构造函数:

template<class T> MyClass(const T& myObj);

在这种情况下,我认为将数据成员更改为int更好。尽管如此,应该先调用第一个构造函数,然后再调用第二个。