C++中new 一个对象的时候加括号和不加括号的区别
2013-05-08 11:00
330 查看
先把结论放上来:
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求
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
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求
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
相关文章推荐
- C++中new 一个对象的时候加括号和不加括号的区别
- new 一个对象的时候加括号和不加括号有什么区别
- C++中new 一个对象的时候加括号和不加括号的区别
- C++中创建对象的时候加括号和不加括号的区别
- C++中创建对象的时候加括号和不加括号的区别
- C++中new 一个对象的时候加括号和不加括号的区别
- C++中创建对象的时候加括号和不加括号的区别
- C++中创建对象的时候加括号和不加括号的区别
- C/C++日常学习总结(第二篇)结构体和类的大小及区别&为什么是new一个对象而不是malloc
- new对象时,类名后加括号与不加括号的区别
- 读书笔记 effective c++ Item 21 当你必须返回一个对象的时候,不要尝试返回引用
- new对象时,类名后加括号与不加括号的区别
- Javascript中调用一个函数(对象),使用new或者直接调用有什么区别?
- C++用new和不用new创建类对象区别
- 转:C++中定义类的对象:用new和不用new有何区别?
- xiao *xx=xiao();new一个对象用指针与不用指针的区别
- C++用new创建对象和不用new创建对象的区别解析
- C++用new来创建对象和非new来创建对象的区别
- 读书笔记 effective c++ Item 21 当你必须返回一个对象的时候,不要尝试返回引用
- effective c++ Item 17: 在一个独立的语句中将 new 出来的对象存入智能指针