zoukankan      html  css  js  c++  java
  • [C++]new Foo 和 new Foo()的区别

    原文地址http://unixjunkie.blogspot.com/2009/05/c-new-foo-vs-new-foo.html

    翻译加修订

    问题是:在C++中,以下两者有何不同

    1. new Foo;
    2. new Foo();

    两者都是正确的语句,它们都返回一个指针,指向新创建的Foo(存放在堆中)。但是,当Foo是POD类型时,它们的表现有所不同。

    PS:POD类型是指一个类或对象,其成员是原生数值类型(int, unsigned char, float, bool等等)或者另外一个POD类型。POD对象看起来像C语言风格的结构对象,例如:

    // POD
    class Foo {
        public:
        int a;
    };
    
    // NOT a pod
    class Bar {
        public:
        int a;
        string name; // not a POD type
    };

    当Foo是POD类型时,new Foo不会初始化,而new Foo()会将成员初始化为默认值

    struct Foo {
        int a;
    };
    int main() {
        Foo* foo = new Foo;
        foo->a = 7;
        delete foo;
        Foo* new_foo = new Foo;
        printf("new_foo->a = %d\n", new_foo->a);
        delete new_foo;
        return 0;
    }

    a值将为不定值,编译器不同结果不同。例如在gcc下,a值将为旧值,即第一次赋值后的7。而在vc下,a值将为0xcccccccc。

    struct Foo {
        int a;
    };
    int main() {
        Foo* foo = new Foo();
        foo->a = 7;
        delete foo;
        Foo* new_foo = new Foo();
        printf("new_foo->a = %d\n", new_foo->a);
        delete new_foo;
        return 0;
    }

    a值将初始化为0

  • 相关阅读:
    XStream教程
    Log4j教程
    Java.io包
    Java输入/输出教程
    Java.math.BigDecimal.abs()方法
    数据类型转换
    JUnit教程
    java.lang
    标识符
    PHP面向对象笔记解析
  • 原文地址:https://www.cnblogs.com/SelaSelah/p/2554620.html
Copyright © 2011-2022 走看看