C++中new 一个对象的时候加括号和不加括号的区别
2016-04-08 14:32
369 查看
先把结论放上来:
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求
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.net/ymqq1/article/details/8899184
加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求
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.net/ymqq1/article/details/8899184
相关文章推荐
- c语言:用双向链表实现双端队列(队列两端都可以进行入队出队操作)
- C++的<unordered_set>
- [C++]打印三角形&棱形.
- c++11改进我们的模式之改进单例模式
- C++之类的友元函数
- c++上机实验3-判断某一年的月份
- 【C++】 斐波那契数列
- hihoCoder:1039字符串消除
- C++之类型强转
- C++注释规范
- C/C++ typedef 用法小结
- Item 01:视C++为一个语言联邦
- C++ 编译时'setw' was not declared in this scope问题
- (1)c++基础知识
- 类型转换总结
- c++之多线程
- Effective C++:条款29:为“异常安全”而努力是值得的
- C++ string 与 C char *
- 【ThinkingInC++】75、多重继承
- C++的Json解析库:jsoncpp和boost