【问题标题】:Instantiate an Object with curly braces C++用花括号 C++ 实例化一个对象
【发布时间】:2016-10-06 04:58:33
【问题描述】:

我已经阅读了很多关于使用大括号进行初始化的解释:

PhoneNumber homePhone = {858, 555, 1234};

还有

int x2 = val; // if val==7.9, x2 becomes 7 (bad)

char c2 = val2; // if val2==1025, c2 becomes 1 (bad)

int x3 {val}; // error: possible truncation (good)

char c3 {val2}; // error: possible narrowing (good)

char c4 {24}; // OK: 24 can be represented exactly as a char (good)

char c5 {264}; // error (assuming 8-bit chars): 264 cannot be 
               // represented as a char (good)

但是,我在这里遇到了一些我找不到示例的代码,也许我不知道这个术语,所以我可以谷歌它:

auto ac1 = ArrayClass{};

我已经习惯了

ArrayClass ac1 = new ArrayClass();

首先是:

auto ac1 = ArrayClass{};

ArrayClass ac1 = ArrayClass{};

其次,

如果我在构造函数中使用了初始化列表,我是否只允许使用大括号?

最后,如果我有参数,以下是否正确?

auto ac1 = ArrayClass{1,4,"hi", true}

感谢您的帮助

【问题讨论】:

    标签: c++ object initialization


    【解决方案1】:

    这种初始化方式称为列表初始化。你可以在http://en.cppreference.com/w/cpp/language/list_initialization阅读更多内容。


    习惯了

    ArrayClass ac1 = new ArrayClass();
    

    这不是正确的 C++ 语法。您可以使用:

     ArrayClass* acPtr = new ArrayClass();
    

    首先是:

    auto ac1 = ArrayClass{};
    

    ArrayClass ac1 = ArrayClass{};
    

    是的,是一样的。


    其次,

    如果我在构造函数中使用了初始化列表,我是否只允许使用大括号?

    是的。


    最后,如果我有参数,以下是否正确?

    auto ac1 = ArrayClass{1,4,"hi", true};
    

    如果满足以下条件,您可以使用该语法:

    ArrayClass 至少有四个成员,
    第一个成员可以使用1
    初始化 第二个成员可以使用4
    初始化 第三个成员可以使用"hi"
    初始化 第四个成员可以使用true
    初始化 任何其他剩余成员都可以进行值初始化。

    您可以在http://en.cppreference.com/w/cpp/language/value_initialization 阅读有关值初始化的更多信息。

    【讨论】:

    • 链接文档对于 C++ 新手来说几乎是不可能理解的。
    【解决方案2】:
    auto ac1 = ArrayClass{};
    

    在堆栈上分配,当堆栈消失时,变量会自动清理。

    ArrayClass ac1 = new ArrayClass();
    

    是无效的,除非 ArrayClass 被 typedef 为指针。无论如何, new ArrayClass() 在堆上分配内存,必须通过调用delete 来显式清理它。

    自动 ac1 = ArrayClass{};

    ArrayClass ac1 = ArrayClass{};

    是的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 2015-05-07
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多