C++ new 一个对象是加括号与不加括号的区别

C++构造函数调用方式
博客介绍了C++中构造函数的调用方式,加括号可调用无参构造函数,不加括号则调用默认构造函数或唯一的构造函数。
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数。
<think>嗯,用户问的是在C++new一个括号不加括号区别。我需要先回忆一下相关的知识点。记得在C++中,当使用new创建对象括号会进行值初始化,而不加的话可能是默认初始化。不过这可能类型是否是POD类型有关,或者是C++版本的不同导致的差异。 首先,对于内置类型比如int,如果使用new int(),会被初始化为0,而new int则不会初始化,保留随机值。但是对于类类型,特别是用户定义的类,如果类有默认构造函数,那么无论是否括号,都会调用默认构造函数。这候可能不加括号没有区别。 不过,如果类是聚合体,也就是没有用户声明的构造函数,没有私有或保护的非静态数据成员,没有基类,没有虚函数等等,那么new括号的话,可能会进行聚合初始化,将所有成员初始化为零或者其他合适的值。而不带括号的话,可能会让成员保持未初始化。 然后还要考虑C++03C++11之间的区别。例如在C++03中,对于自定义类型,括号会调用默认构造函数,而不加的话可能也会调用,但在某些情况下可能会有不同的行为,比如是否进行零初始化。 还有一点是,如果类有用户提供的默认构造函数,那么不管有没有括号,都会调用该构造函数,所以此两者行为一致。而对于没有用户提供构造函数的类,比如POD类型,括号会进行值初始化,成员可能被零初始化,而不加的话可能不会,导致成员未初始化。 需要举例子来说明,比如内置类型、有构造函数的类、POD结构体等不同情况下的表现。同要指出在C++11之后,使用大括号{}初始化更推荐,可以避免一些歧义。 总结一下,主要区别在于是否进行值初始化,特别是当类型没有用户定义的构造函数括号会导致成员被零初始化,而不加则不会。而对于有构造函数的类,无论是否括号,都会调用默认构造函数,所以此行为相同。</think><< 在C++中,使用`new`创建对象括号`()`不加括号的主要区别体现在初始化方式上,具体行为取决于对象的类型: 1. **对内置类型/POD类型**: ```cpp int* a = new int; // 默认初始化(值未定义) int* b = new int(); // 值初始化(初始化为0) struct Pod { int x; float y; }; Pod* p1 = new Pod; // 默认初始化(成员值未定义) Pod* p2 = new Pod(); // 值初始化(成员被零初始化) ``` 2. **对具有默认构造函数的类类型**: ```cpp class MyClass { public: MyClass() { x = 5; } // 用户提供的默认构造函数 int x; }; MyClass* c1 = new MyClass; // 调用默认构造函数,x=5 MyClass* c2 = new MyClass(); // 调用默认构造函数,x=5 ``` 3. **对具有自动生成构造函数的类类型**: ```cpp class EmptyClass {}; EmptyClass* e1 = new EmptyClass; // 默认初始化 EmptyClass* e2 = new EmptyClass(); // 值初始化(无实际区别) ``` **核心区别**: - 括号会执行值初始化(value-initialization) - 不加括号执行默认初始化(default-initialization) - 对于具有用户定义构造函数的类型,两者行为一致 - 对于POD类型,括号会将成员初始化为零值 **C++11后的最佳实践**: 推荐使用统一初始化语法: ```cpp auto p = new MyClass{}; // 明确初始化(避免most vexing parse问题) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值