Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;关于从类型a转换到类型b和实例化/构造类型b之间的区别,标准是什么?_C++_Casting_Constructor - Fatal编程技术网

C++ C++;关于从类型a转换到类型b和实例化/构造类型b之间的区别,标准是什么?

C++ C++;关于从类型a转换到类型b和实例化/构造类型b之间的区别,标准是什么?,c++,casting,constructor,C++,Casting,Constructor,可能重复: 如果您有一个接受类型为b的参数的函数,但在调用站点,您只有一个类型为a的变量。将函数参数从a转换为b与构造类型b之间是否存在差异 我感兴趣的具体示例是,没有用户定义的cast运算符,但有一个单参数构造函数 例如: 功能定义: void DoWork(const B &arg1); 在我的具体示例中,类型a是const char* 呼叫地点: DoWork((B)"Hello"); vs B类定义 class B { public: B() : m_szValue

可能重复:

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

我感兴趣的具体示例是,没有用户定义的cast运算符,但有一个单参数构造函数

例如:

功能定义:

void DoWork(const B &arg1);
在我的具体示例中,类型a是
const char*

呼叫地点:

DoWork((B)"Hello");
vs

B类定义

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

编写C风格的演员表
(T)x
,其中
x
属于
U
类型,或多或少会按顺序尝试以下操作:

  • 如果
    T
    U
    属于类类型,请查找转换运算符
    U::operator T()const
    或单参数构造函数
    T::T(U)

  • 如果
    T
    U
    是基本类型,则应用标准值转换(int到double等)

  • 重新解释演员阵容(x)

  • 但是请注意,不能同时具有转换运算符和隐式转换构造,否则调用将不明确


    [更正/澄清:]在
    T(x)
    (T)x
    [/]之间没有区别,你甚至可以说
    DoWork(“你好”)由于单参数构造函数提供的隐式转换。(不要允许这种偷偷摸摸的行为,声明构造函数
    explicit
    ,这对于单参数构造函数来说通常是个好主意。)

    注意这个问题是多么的清晰。这是误导性的/错误的:事实上,C样式转换和函数样式转换之间没有任何区别(语法除外)。它们在各方面都是相同的;不仅在OP的代码中,而且在任何地方。@Konrad:Hm。。。但这其中哪一方面是错误的?C型造型达到了所列结构中任何一种的效果,不是吗?要点是它包含了各种转换和重新解释,你可以用C++结构来明确控制。@你的答案强烈地暗示了<代码> t(x)< />有时有不同于(t)x<代码>的含义。至少我会这样理解你的答案。你明确地说“在你的代码中没有区别”(强调我的),虽然这是真的,但这也是一个不相关的细节。没什么区别,句号。@Konrad:我明白了,说得好,让我改写一下。@Konrad:现在看看,我希望这更准确些!
    class B
    {
    public:
        B() : m_szValue(){}
        B(const char *szValue) { strcpy (m_szValue, szValue); }
    private:
        char m_szValue[MAX_VALUE_LEN + 1];
    };