c++ new带括号和不带括号
来源:互联网 发布:网络节目收拾排行榜 编辑:程序博客网 时间:2024/04/29 00:55
在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?
比如:
CBase *base = new CDerived();
CBase *base = new CDeviced;
很多人都说,加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数。这是有问题的。
对于自定义类类型:
如果该类没有定义构造函数(由编译器合成默认构造函数)也没有虚函数,那么class c = new class;将不调用合成的默认构造函数,而class c = new class();则会调用默认构造函数。
如果该类没有定义构造函数(由编译器合成默认构造函数)但有虚函数,那么class c = new class;和class c = new class();一样,都会调用默认构造函数。
如果该类定义了默认构造函数,那么class c = new class;和class c = new class();一样,都会调用默认构造函数。
对于内置类型:
int *a = new int;不会将申请到的int空间初始化,而int *a = new int();则会将申请到的int空间初始化为0。
以下两个语句的区别是:第一个动态申请的空间里面的值是随机值,第二个进行了初始化,里面的值为0:
- int *p1 = new int[10];
- int *p2 = new int[10]();
结论:别使用不带括号的new。
class A{
public:
//A(){a=1;}
public:
int a;
};
A *a1=new A;
A *a2=new A();
cout<<a1->a<<endl; //输出:-842150451
cout<<a2->a<<endl; //输出0
A a3;
cout<<a3.a<<endl; //运行异常,a没有初始化。
如果加上一个virtual,如virtual ~A(){},
则
cout<<a1->a<<endl; //输出:-842150451
cout<<a2->a<<endl; //输出 -842150451
-------------下面是网上找的帖子,对理解上面的现象可能会有帮助-------------------
一个类满足下列其中任何一个条件:
1.包含了一个类的对象,这个对象有一个构造函数(包括编译器合成的默认构造函数)
2.如果继承自一些基类,其中某些基类有一个构造函数(包括编译器合成的默认构造函数)
3.有一个虚函数,或者继承到了虚函数
4.有虚基类
如果这个类没有默认的构造函数,编译器就会合成一个默认的构造函数,分别做以下事情
如果这个类有构造函数,编译器就会扩张所有构造函数,做以下事情
1.调用这个对象的构造函数
2.调用基类的构造函数
3.设置正确的虚函数表指针
4.设置指向虚基类对象的指针
去读下《深入理解c++对象模型》,那里面解释的很清楚
--------------帖子到这里over----------------------------------------------------
- [C++] new带括号和不带括号
- [C++]new带括号和不带括号
- c++ new带括号和不带括号
- new带括号与不带括号的区别
- [转载]new带括号与不带括号的区别
- new带括号与不带括号的区别
- js里调用函数时,函数名带括号和不带括号的区别
- JavaScript 函数调用时带括号和不带括号的区别!!!
- javascript中的函数带括号和不带括号的问题。
- js中function的带括号和不带括号的区别
- JavaScript 函数调用时带括号和不带括号的区别
- js里调用函数时,函数名带括号和不带括号的区别
- javascript中函数调用带括号和不带括号的区别
- JavaScript 函数调用时带括号和不带括号的区别
- C/C++带括号四则运算
- C/C++带括号四则运算
- 不带括号的四则运算步骤
- 不带括号的简单四则运算
- Logstash ELK Stack Install & Configuration
- ceph存储 iozone集群测试方案以及iozone使用详解经典
- linux 下安装svn 钩子自动提交
- 最常用的 100 个 Java 类
- MD5 SHA1 BASE64加密算法
- c++ new带括号和不带括号
- 单击响应事件
- NFC 学习总结(上)
- CFLAGS参数详解(Desktop cflags)
- 图像变换
- 整数划分问题
- Linux安装小记
- 性能测试知多少---吞吐量
- Android ObjectAnimator动画效果实现