0

我有两个重载的构造函数:

Hello::Hello(std::string message)
{
}

Hello::Hello(int *number)
{
}

这些构造函数中的任何一个都可以获取内存地址。如果我这样做了,Hello hi(NULL);那么哪个会被调用?

另外,如果您可以解释规则,因为它们涉及重载的对象。类似地,如果我有一个构造函数对参数 ( Object::Object(long x)) 使用了 long,而另一个重载 ( Object::Object(SomeOtherObject o)) 使用了一个对象,该对象本身对 long ( SomeOtherObject::SomeOtherObject(long x)) 进行了重载。然后我打电话Object obj((long)5);是否保证会打电话给另一个?

4

3 回答 3

2

有一个构造函数与您的示例完全无关。它只是关于重载解决方案,您可以使用两个函数对其进行检查:

void foo(std::string s) {
}

void foo(int* n) {
}

调用foo(NULL)将导致调用foo(int*)NULL是空指针常量,可以隐式转换为每种指针类型,在这种情况下最好的转换是int*. 另一个过载将需要两次转换,这被评为更糟。

第二种情况很明显:完美匹配是首选。

于 2012-08-12T22:15:23.037 回答
2

调用std::string构造函数需要额外的隐式转换,因此int*是首选。

对于第二种情况,则首选初始构造函数。当编译器在那里完美匹配时,为什么编译器会寻找任何其他构造函数?再一次,它包括一个隐式转换,这比直接long构造函数提供的完美匹配更糟糕。

于 2012-08-12T22:11:01.847 回答
1

Wrt 您在第二个问题中指出的问题,可以强制重载解决方案以预期的方式运行。

当你有一个带有单个对象的类构造函数时,比如你的Object(SomeOtherObject o),风格上最好用单词标记那个构造函数explicit,这样编译器就不会尝试进行隐式转换。例如给定定义:

class A {
  A(int x);
};

class B {
  explicit B(A a);
};

试图创建一个像这样的对象B b(100)将是一个编译错误。

另请参阅有关此主题的Google C++ 样式指南部分。

于 2012-08-12T22:32:11.910 回答