C ++标准对从类型a转换为类型b和实例化/构造类型b之间的区别有什么看法?

时间:2011-09-19 10:09:20

标签: c++ casting constructor

  

可能重复:
  What is the difference between (type)value and type(value)?

如果你有一个带有b类型参数的函数,但是在调用站点你只有一个类型为a的变量。将函数参数从a转换为b和构造类型b之间是否存在差异。

我感兴趣的具体示例是没有用户定义的强制转换运算符,但是只有一个参数构造函数。

示例:

功能定义:

void DoWork(const B &arg1);

在我的具体示例中,类型a为const char *

致电网站:

DoWork((B)"Hello");

VS

DoWork(B("Hello"));

B类定义

class B
{
public:
    B() : m_szValue(){}
    B(const char *szValue) { strcpy (m_szValue, szValue); }
private:
    char m_szValue[MAX_VALUE_LEN + 1];
};

1 个答案:

答案 0 :(得分:3)

编写C样式广告(T)x,其中x类型为U,或多或少按顺序尝试以下内容:

  1. 如果TU属于班级类型,请查找转化运算符U::operator T() const或单参数构造函数T::T(U)

    < / LI>
  2. 如果TU是基本类型,请应用标准值转换(int to double等)。

  3. reinterpret_cast<T>(x)

  4. 请注意,您不得两者转换运算符和隐式转换构造,否则调用将不明确。

    [更正/澄清:] T(x)(T)x之间没有区别。[/]你甚至可以说DoWork("Hello");因为< em>单参数构造函数提供的隐式转换。 (请禁止这种偷偷摸摸的行为,声明构造函数explicit,这对于单参数构造函数来说通常是一个好主意。)