new一个对象的时候加括号和不加括号

本文探讨了C++中使用new操作符创建对象时,不带括号与带括号的区别。对于自定义类型,这两种方式都调用无参构造函数,但对于内置类型,带括号的形式将进行值初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CBase *base = new CDerived();
CBase *base = new CDeviced;

对于自定义类型,调用的都是无参构造函数,没区别的

只不过对于内建类型不太一样,加了扩号会做默认值初值化

比如(在VS 2010上验证):

int* p = new int;//p指向的int值是不确定的;

int* q = new int();//q指向的int值为0。


参考 http://bbs.youkuaiyun.com/topics/320161716

<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、付费专栏及课程。

余额充值