zoukankan      html  css  js  c++  java
  • 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----------------------------------------------------



  • 相关阅读:
    ASP.NET2.0中创建自定义配置节处理程序(声明性模型) joe
    .Net3.0里的DependencyProperty(1) joe
    详解Javascript匿名函数的使用(转) joe
    Mark:未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值 joe
    设置windows 7 默认登陆帐户 joe
    数据库的回滚
    关于软件开发人员如何提高自己的软件专业技术方面的具体建议
    查询表结构
    readonly 和 const总结
    深入NHibernate映射
  • 原文地址:https://www.cnblogs.com/youxin/p/3735064.html
Copyright © 2011-2022 走看看