RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1073078
Accepted
ibse
ibse
Asked:2020-01-22 23:13:40 +0000 UTC2020-01-22 23:13:40 +0000 UTC 2020-01-22 23:13:40 +0000 UTC

用括号声明对象

  • 772

struct S {};

有什么区别

S s;
S* s_ptr = new S;

和

S s();
S* s_ptr = new S();

?

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Qwertiy
    2020-01-22T23:58:47Z2020-01-22T23:58:47Z

    关于新

    对于具有非默认构造函数的类型,没有区别。但是对于内置类型和具有默认构造函数的类型,带括号的版本将被初始化为零,没有括号的版本将保持内部垃圾。

    http://codepad.org/vYwvxMn5

    #include <cstdio>
    
    struct smth
    {
      int value;
      smth() : value(0) { puts("Constructor called"); }
    };
    
    struct defctr
    {
      int value;
    };
    
    #define CHECK(TYPE, ARGS, VALUE) do                              \
      {                                                              \
        TYPE *x = new TYPE ARGS;                                     \
        printf("%p %08X new %s%s\n", (void*)x, VALUE, #TYPE, #ARGS); \
        delete x;                                                    \
      } while(0)
    
    int main()
    {
      CHECK(int, (-1), *x);
      CHECK(int,     , *x);
      CHECK(int, ()  , *x);
    
      CHECK(defctr,   , x->value);
      CHECK(defctr, (), x->value);
    
      CHECK(smth,   , x->value);
      CHECK(smth, (), x->value);
    
      return 0;
    }
    
    0x8110438 FFFFFFFF new int(-1)
    0x8110438 93939393 new int
    0x8110438 00000000 new int()
    0x8110438 93939393 new defctr
    0x8110438 00000000 new defctr()
    Constructor called
    0x8110438 00000000 new smth
    Constructor called
    0x8110438 00000000 new smth()
    

    没有新的

    这是一个变量:

    S s;
    

    这是函数原型:

    S s();
    
    • 5
  2. HolyBlackCat
    2020-01-23T01:38:11Z2020-01-23T01:38:11Z

    首先,S s();它是一个函数声明,而不是一个对象声明(参见最令人烦恼的解析)。
    要将其视为对象,您可以执行S s = S();或S s{};,含义相同。

    其次,除了()您也可以使用它们之外{},它们的行为方式相同。唯一的区别是{}大多数令人烦恼的解析不受影响。

    第三,new它不会改变括号的含义(但会删除可能最令人烦恼的解析)。


    如果S是数字类型、、enum指针或指向成员的指针,则附加()(或{})会将其初始化为零。否则,它保持未初始化状态。

    如果S是您自己为其编写了默认构造函数的类,则添加()(或{}) 不会改变任何内容。

    如果S是编译器为其生成默认构造函数的类(也就是说,您根本没有为它声明构造函数,或者您将默认构造函数标记为=default在类主体中:)S() = default;,然后添加()(或{})初始化所有字段否则将保持为零将未初始化(即,未指定默认初始化程序的那些字段)。

    以上不适用于全局/静态对象 - 它们(及其字段)永远不会未初始化。如果它们(或它们的某些字段)未初始化,则将它们设置为零。

    例子:

    void foo()
    {
        int x; // Не инициализирован.
        int x{}; // 0
        void *x; // Не инициализирован.
        void *x{}; // nullptr
    
        struct A
        {
            int f;
            int g = 1;
    
            // Не влияет на результат:
            // A() = default;
        };
        A a; // f не инициализирован, g = 1
        A a{}; // f = 0, g = 1
    
        struct B
        {
            int f;
            int g = 1;
            int h;
    
            B() : h(2) {}
        };
        B b;   // f не инициализирован, g = 1, h = 2.
        B b{}; // f не инициализирован, g = 1, h = 2.
    }
    
    • 3

相关问题

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5