C++中new 一个对象的时候加括号和不加括号的区别
2016-10-09 10:35
495 查看
先把结论放上来:
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求。 (//P:每一个类都存在一个什么都不做的默认构造函数。)
C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。
以下代码:
#include <iostream>
using namespace std;
int main()
{
int *a=new int[1000];
for(int i=0;i<1000;i++){
a[i]=i+1;
}
delete[] a;
int *b=new int[1000];
for(int i=0;i<100;i++){
cout<<b[i]<<endl;
}
return 0;
}
没有初始化,输出的结果是:
9437380
9443448
3
4
5
6
。。。
可见,new操作符并没有对内存进行初始化。
而稍微改变一下代码(在new之后添加括号()):
#include <iostream>
using namespace std;
int main()
{
int *a=new int[1000];
for(int i=0;i<1000;i++){
a[i]=i+1;
}
delete[] a;
int *b=new int[1000]();
for(int i=0;i<100;i++){
cout<<b[i]<<endl;
}
return 0;
}
输出结果为:
0
0
0
0
。。
可见,已经进行了初始化。
=============================================================================
进一步思考:
定义类A:
class A{
public:
int a;
A():a(10){};
};
main函数中使用语句:
A *b=new A;
cout<<b->a<<endl;
A *b=new A();
cout<<b->a<<endl;
输出结果都是10,可见都进行了初始化。
但是,如果吧A的构造函数删掉,则两个语句输出的结果分别是:随机数,0。
由此可见,C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。
PS:1.原文地址:http://hi.baidu.com/maxy218/item/8cd098256327c1829d63d1ca
2.修改参考:http://bbs.csdn.net/topics/320161716
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.NET/ymqq1/article/details/8899184
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求。 (//P:每一个类都存在一个什么都不做的默认构造函数。)
C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。
以下代码:
#include <iostream>
using namespace std;
int main()
{
int *a=new int[1000];
for(int i=0;i<1000;i++){
a[i]=i+1;
}
delete[] a;
int *b=new int[1000];
for(int i=0;i<100;i++){
cout<<b[i]<<endl;
}
return 0;
}
没有初始化,输出的结果是:
9437380
9443448
3
4
5
6
。。。
可见,new操作符并没有对内存进行初始化。
而稍微改变一下代码(在new之后添加括号()):
#include <iostream>
using namespace std;
int main()
{
int *a=new int[1000];
for(int i=0;i<1000;i++){
a[i]=i+1;
}
delete[] a;
int *b=new int[1000]();
for(int i=0;i<100;i++){
cout<<b[i]<<endl;
}
return 0;
}
输出结果为:
0
0
0
0
。。
可见,已经进行了初始化。
=============================================================================
进一步思考:
定义类A:
class A{
public:
int a;
A():a(10){};
};
main函数中使用语句:
A *b=new A;
cout<<b->a<<endl;
A *b=new A();
cout<<b->a<<endl;
输出结果都是10,可见都进行了初始化。
但是,如果吧A的构造函数删掉,则两个语句输出的结果分别是:随机数,0。
由此可见,C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。
PS:1.原文地址:http://hi.baidu.com/maxy218/item/8cd098256327c1829d63d1ca
2.修改参考:http://bbs.csdn.net/topics/320161716
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.NET/ymqq1/article/details/8899184
相关文章推荐
- C++中new 一个对象的时候加括号和不加括号的区别
- new 一个对象的时候加括号和不加括号有什么区别
- C++中创建对象的时候加括号和不加括号的区别
- C++中创建对象的时候加括号和不加括号的区别
- C++中new 一个对象的时候加括号和不加括号的区别
- C++中创建对象的时候加括号和不加括号的区别
- C++中new 一个对象的时候加括号和不加括号的区别
- C++中创建对象的时候加括号和不加括号的区别
- C/C++日常学习总结(第二篇)结构体和类的大小及区别&为什么是new一个对象而不是malloc
- console.log的一个应用 -----用new方法生成一个img对象和document.createElement方法创建一个img对象的区别
- new 一个空的数组对象和a[0]=null的区别
- C++用new和不用new创建类对象区别
- C++用new和不用new创建类对象区别
- C++中对象使用new与不使用new的区别
- C++中定义类的对象:用new和不用new有何区别?
- 用new方法生成一个img对象和document.createElement方法创建一个img对象的区别
- C++用new和不用new创建类对象区别 .
- C++中定义对象的语法,带括号与不带括号有什么区别?
- 用new方法生成一个img对象和document.createElement方法创建一个img对象的区别
- C++用new来创建对象和非new来创建对象的区别