c++ new带括号和不带括号

在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:

  1. int *p1 = new int[10];

  2. 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----------------------------------------------------

时间: 2024-12-31 19:48:33

c++ new带括号和不带括号的相关文章

js中new函数后带括号和不带括号的区别

用new创建构造函数的实例时,通常情况下new 的构造函数后面需要带括号(譬如:new Parent()). 有些情况下new的构造函数后带括号和不带括号的情况一致,譬如: function Parent(){this.num = 1;}console.log(new Parent());//输出Parent对象:{num:1}console.log(new Parent);//输出Parent对象:{num:1} 1 1 function Parent(){ 2 2 this.num = 1;

python 类带括号和不带括号的区别

Python创建类的时候,加()和不加有什么区别.联系? Python中函数带括号和不带括号的区别 原文地址:https://www.cnblogs.com/ppybear/p/12348736.html

C++中#include包含头文件带 .h 和不带 .h 的区别

C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些不同? 之前在写C++程序的时候只知道使用 #include <iostream> 的时候,使用函数前要用 using namespace std; 导入命名空间,而 #include <iostream.h> 则不用,这个得看C+ +标准化过程为C++开发者做了哪些有意义的工作. (

python带参数和不带参数装饰器

http://blog.csdn.net/pipisorry/article/details/41902599 对于无参数的装饰器,其装饰器函数的参数是要被装饰的函数对象名: 对于有参数的装饰器在调用时使用的是应用的参数,@timeStumpFunc_args(argv)的argv,已不再是要被装饰的函数对象名,所以必须在内部再定义一个函数getfunc()来接收要被装饰的函数对象. #!/usr/bin/env python # coding=gbk """ __title

【其他】UTF-8带签名与不带签名

在 Visual Web Developer 另存为文件时,有编码选项,其中有: Unicode (UTF-8 with signature) - Codepage 65001 Unicode (UTF-8 without signature) - Codepage 65001 这两个都是 UTF-8,一个带签名,一个不带签名,有什么区别呢? 带签名也就是带 BOM 信息,不带签名就是不带 BOM. 如果这个网页是用来被别人包含的,如 ASP 中的 include,那么这个网页就不要带签名,否则

5个KO实例带你装B带你飞

Knockoutjs 以下简称 ko, 是一个 javascript 的 MVVM 框架. 在 MVC 4 的项目模板中, 默认会引用 knockoutjs, 我正式接触它也不过4个月的时间. 在没有使用它之前, 要做一个主从关系的维护, 大概要写一堆 CloneNode / Append, js 水平一般的同学, 要写这样一个业务页面, 大概要写几百几千行 js 才行. 本示例不是介绍 ko 的用法, 而是 以 我在项目中 处理过的 稍有些复杂的 业务 为原型, 做深入一步的理解如何用KO带你

带你装逼带你飞之微信群聊匿名消息

带你装逼带你飞之微信群聊匿名消息 记得八月份网上有个IOS版的微信匿名消息插件,可是2天后被封了...废话不说,其实封的是插件,不是原理~ 九月份,UWP 微信出来了(?),然而那个微信有BUG,比如模板消息可以随便转发...(就是类似微信支付消息,登陆通知消息etc…)所以可以利用这一点进行发送装逼消息.(如果还想长时间装逼,那么请关闭自动更新功能) 如果你有公众号那么就发个消息直接转发吧,如果没有的话照下面做... 发消息前的准备:退出UWP微信的登陆并清空所有数据.Windbg调试工具并于

直接插入排序(带哨兵和不带哨兵)

前言 插入排序(insertion sort)的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排序好的序列中,直到全部记录插入完成为止. 直接插入排序 基本思想 假设待排序的记录存放在数组R[1..n]中.初始时,R[1]自成1个有序区,无序区为R[2..n].从i = 2起直到i = n 为止,依次将R[i]插入当前的有序区R[1..i - 1]中,生成含n个记录的有序区. 排序方法 将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i - 1, i - 2,

JavaScript 函数调用时带括号和不带括号的区别

function countBodyChildren(){ var body_element = document.getElementsByTagName("body")[0]; alert(body_element.childNodes.length); } window.onload = countBodyChildren; //window.onload = countBodyChildren(); 代码功能:在弹出框显示body元素的子元素. 不带括号为9: 带括号为8,在加