C++中new是否进行初始化的问题

来源:互联网 发布:淘宝我的好友在哪里找 编辑:程序博客网 时间:2024/05/16 17:30

C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。

 

以下代码:

#include <iostream>using namespace std;int main(){    int *b=new int[4];    for(int i=0;i<4;i++){        cout<<b[i]<<endl;    }delete []b;b=NULL;system("pause");    return 0;}


没有初始化,输出的结果是:

-842150451

-842150451

-842150451

-842150451


可见,new操作符并没有对内存进行初始化。

而稍微改变一下代码(在new之后添加括号()):

#include <iostream>using namespace std;int main(){    int *b=new int[4]();    for(int i=0;i<4;i++){        cout<<b[i]<<endl;    }delete []b;b=NULL;int *a=new int();cout<<*a;system("pause");    return 0;}


输出结果为:

0

0

0

0

0

可见,已经进行了初始化。

 =============================================================================

进一步思考:

定义类A:

class A{public:    int a;    A():a(10){};};

main函数中使用语句:

<pre name="code" class="cpp">A *b=new A;cout<<b->a<<endl;
   
A *b=new A();cout<<b->a<<endl;

输出结果都是10,可见都进行了初始化。

但是,如果吧A的构造函数删掉,则两个语句输出的结果分别是:随机数,0。

 

由此可见,C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。

0 0
原创粉丝点击