new一个类对象加()和不加()的区别

本文探讨了在C++中使用new操作符时,加括号与不加括号的区别。对于类对象,两者调用默认构造函数,无明显区别;但对于基础数据类型,加括号会进行初始化,不加则不会。建议在使用new时,始终包含括号。

1. 一般情况下,new出来的是类对象,加不加()调用的都是默认构造函数,因此没有区别。

代码如下:

class CText
{
public:
  explicit CText()
  {
    cout << "Text!" << endl;
  }
};

int main()
{
  CText* pText1 = new CText;
  CText* pText2 = new CText();
  return 0;
}

输出结果如下:

 

2. 但是如果new出来的是基础数据类型,不加()是不会对开辟的空间做初始化,而加了()会对开辟的空间做初始化。

我们可以对该现象进行验证,代码如下:

char* ch1 = new char[20];
char* ch2 = new char[20]();
cout << ch1 << endl;
cout << ch2 << endl;
cout << "=========" << endl;
int* i1 = new int[1];
int* i2 = new int[1]();
cout << i1[0] << endl;
cout << i2[0] << endl;

输出结果:

 总结:综上所述,无论哪种情况,在使用new的时候,最好把()也加入进去

<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问题) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值