C++ C(3)之间的区别是什么;和C{3};当实例化一个类时? #包括 使用名称空间std; C类{ 公众:int a,; public:C(inti){a=i;} }; int main() { C(3);//C{3}; cout

C++ C(3)之间的区别是什么;和C{3};当实例化一个类时? #包括 使用名称空间std; C类{ 公众:int a,; public:C(inti){a=i;} }; int main() { C(3);//C{3}; cout,c++,initialization,C++,Initialization,有两个区别: 大括号初始化语法(假设列表为非空)可以调用std::initializer\u list构造函数,如果可能,将始终这样做。括号语法不会调用std::initializer\u list构造函数 大括号初始化语法禁止缩小转换范围 在您的示例中没有区别,但是: 如果C有一个采用std::initializer\u list的构造函数,那么C{3}将调用该构造函数,而C(3)将调用采用int的构造函数 C{3.14}将不会编译,因为转换正在缩小,但是C(3.14)将编译 这种情况的效果是

有两个区别:

  • 大括号初始化语法(假设列表为非空)可以调用
    std::initializer\u list
    构造函数,如果可能,将始终这样做。括号语法不会调用
    std::initializer\u list
    构造函数

  • 大括号初始化语法禁止缩小转换范围

  • 在您的示例中没有区别,但是:

  • 如果
    C
    有一个采用
    std::initializer\u list
    的构造函数,那么
    C{3}
    将调用该构造函数,而
    C(3)
    将调用采用
    int
    的构造函数

  • C{3.14}
    将不会编译,因为转换正在缩小,但是
    C(3.14)
    将编译


  • 这种情况的效果是相同的

    cc(3);
    is

    检查
    T
    的构造函数,通过重载解析选择最佳匹配。然后调用构造函数初始化对象

    C{3};
    is(自C++11以来)

    如果前一个阶段没有生成匹配,则
    T
    的所有构造函数都会参与针对由带括号的init列表元素组成的参数集的重载解析,限制条件是只允许非收缩转换

    因此,对于这两种情况,
    C::C(int)
    用于初始化对象


    根据
    C
    的行为,
    C(3);
    C{3};
    之间的其他潜在差异包括:

    • 如果
      C
      是,则在列表初始化中首选
    • Ohterwise,如果
      C
      有一个构造函数,那么在列表初始化中首选它
    • 否则,当在中考虑构造函数时,在列表初始化中允许非窄化转换

    我很惊讶没有这方面的规范副本…谢谢。我可以问一下
    C(3)
    C{3}
    的哪种风格在使用OO的其他语言中更受欢迎?Java和C#两者都没有是正确的吗?C#和Java的构造函数几乎与
    C(int I)相同
    ,只是需要注意的是,他们会检查传入的类型。
    新的C(3.14)
    将无法编译。但是,不支持
    {}
    语法。在C#中,
    新的C{a=3}
    是一个对象初始值设定项,您必须在
    {}中指定成员变量
    。您的第一个语句1通常是不正确的:聚合初始化是最高优先级的;然后是空列表的值初始化。然后出现这样的情况,
    C
    本身就是一个
    std::initializer\u list
    。只有在这一点上,才会考虑构造函数,重载解析才有机会匹配构造函数接受
    std::initializer\u list
    C的r。无论如何,从C++14开始,列表初始化规范中的事情顺序似乎随着每一个新标准而变化draft@M.M空列表的好处是,我将更新我的答案以反映这一点。我不认为聚合初始化与我编写的内容冲突,因为类不能既是一个聚合,又有一个
    std::initializer\u list
    构造函数。回答得好。这也可以避免这种情况,谢谢。我可以问一下
    C(3)
    C{3}
    的哪种风格在其他有OO的语言中更流行吗?Java和C#两者都没有是正确的吗?@Ben我不确定,我猜是
    C(3)列表初始化是从C++ 11中引入的,C++中被认为是现代风格。
    
    #include <iostream>
    
    using namespace std;
    
    class C{
        public: int a;
        public: C (int i){a = i ; }
    
    };
    int main()
    {
        C c(3); // C c{3};
        cout<<c.a;
        return 0;
    }