Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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++;_C++_C++11 - Fatal编程技术网

C++ 值初始化c++;

C++ 值初始化c++;,c++,c++11,C++,C++11,在阅读关于值初始化的参考资料时,我得出以下结论: 如果T是没有默认构造函数或具有 用户提供或删除的默认构造函数,对象为 默认初始化 例如: struct T3 { int mem1; std::string mem2; T3() { } // user-provided default constructor }; struct T1 { int mem1; std::string mem2; }; // implicit default constru

在阅读关于值初始化的参考资料时,我得出以下结论:

  • 如果T是没有默认构造函数或具有 用户提供或删除的默认构造函数,对象为 默认初始化 例如:

    struct T3
    {
        int mem1;
        std::string mem2;
        T3() { } // user-provided default constructor
    };
    
    struct T1
    {
        int mem1;
        std::string mem2;
    }; // implicit default constructor
    
    阅读关于违约的文章

    如果T是非POD(直到C++11)类类型,则构造函数是 考虑并承受针对空的过载解决方案 参数列表。所选构造函数(默认值之一) 调用构造函数)以提供新 对象

    如果T是数组类型,则数组的每个元素都是 默认初始化

    否则,什么也不做:自动存储对象 持续时间(及其子对象)初始化为不确定 价值观

    这适用于该示例,T是类类型,这意味着重载解析应该选择用于初始化值的候选对象(用户提供的默认构造函数),但它是空的,因此
    mem1
    应该保留不确定的值(这是真的),但相同的值应该是
    mem2
    ,但这是“默认初始化”为“”,为什么呢?它是递归工作的吗?类类型的T的每个成员都服从第一条规则

    我现在很困惑


    2) 如果T是具有默认构造函数的类类型,则 用户提供或删除(即,它可能是具有 隐式定义或默认构造函数),对象为 零初始化,如果它有 非平凡默认构造函数

    例如:

    struct T3
    {
        int mem1;
        std::string mem2;
        T3() { } // user-provided default constructor
    };
    
    struct T1
    {
        int mem1;
        std::string mem2;
    }; // implicit default constructor
    
    mem1
    初始化为0,但是“非平凡”默认构造函数意味着什么
    mem2
    也默认初始化为“”,但我仍然不确定,“非平凡默认构造函数”是什么意思?默认构造函数应该由编译器生成,但它如何决定什么是非平凡的——如果非平凡的默认构造函数意味着它必须初始化对象——与上面的问题相同,它是否意味着每个对象都用默认构造函数初始化

    mem2也应该是一样的,但这是“默认初始化”为“”,为什么?它是递归工作的吗?类类型的T的每个成员都服从第一条规则

    你的怀疑是对的。默认初始化类时,默认初始化其每个成员,因为构造函数中未指定初始化。因为
    std::string
    有一个用户提供的调用的默认构造函数,它将字符串对象初始化为nothing

    然而,“非平凡”默认构造函数意味着什么

    一个平凡的构造函数是一个什么都不做的构造函数。对于类型
    T
    ,如果

    • 构造函数不是用户提供的(即隐式定义或默认)
    • T
      没有虚拟成员函数
    • T
      没有虚拟基类
    • T
      没有带大括号或同等初始值设定项的非静态成员
    • T
      的每个直接基都有一个微不足道的默认构造函数
    • 类类型的每个非静态成员都有一个普通的默认构造函数
    因此,在
    T1
    的情况下,您没有一个平凡的构造函数,因为
    std::string
    的默认构造函数是非平凡的

    mem2也应该是一样的,但这是“默认初始化”为“”,为什么?它是递归工作的吗?类类型的T的每个成员都服从第一条规则

    你的怀疑是对的。默认初始化类时,默认初始化其每个成员,因为构造函数中未指定初始化。因为
    std::string
    有一个用户提供的调用的默认构造函数,它将字符串对象初始化为nothing

    然而,“非平凡”默认构造函数意味着什么

    一个平凡的构造函数是一个什么都不做的构造函数。对于类型
    T
    ,如果

    • 构造函数不是用户提供的(即隐式定义或默认)
    • T
      没有虚拟成员函数
    • T
      没有虚拟基类
    • T
      没有带大括号或同等初始值设定项的非静态成员
    • T
      的每个直接基都有一个微不足道的默认构造函数
    • 类类型的每个非静态成员都有一个普通的默认构造函数
    因此,在
    T1
    的情况下,您没有一个平凡的构造函数,因为
    std::string
    的默认构造函数是非平凡的

    这适用于examle,T是类类型,这意味着重载解析应该选择候选值来对值进行初始化(用户提供的默认构造函数),但它是空的,因此mem1应该保留Indermined值(这是真的),但同样应该是mem2,但这是“默认初始化”为“”,为什么

    如果从中省略一个数据成员,那么它是默认初始化的,这对于
    std::string
    意味着调用它的默认构造函数并将其初始化为空字符串。默认构造函数没有成员初始值设定项列表,因此所有成员都将获得默认初始化

    “非平凡”默认构造函数是什么意思

    您可以找到一个普通构造函数的需求。一个非平凡的默认构造函数只是一个默认构造函数,它不遵守平凡构造函数的所有要求。简而言之,一个微不足道的默认构造函数除了标记对象生命周期的开始之外,根本不做任何事情(即使在引擎盖下)

    这是否意味着每个对象都使用默认构造函数初始化

    如前所述,默认构造函数(与任何其他构造函数一样)将默认初始化me中未另行指定的任何数据成员