new Foo 和 new Foo()的区别以及Foo f2()的问题

new Foo 和 new Foo()的区别:

问题是:在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
};
//POD
class Bar {
    public:
    int a;
    Bar* str;
};

当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;   <pre name="code" class="cpp" style="font-size: 12.727272033691406px; line-height: 18.99147605895996px;">    cout << new_foo->a << endl;
delete new_foo; return 0;}

 
a值将为不定值,编译器不同结果不同。在VS中为-842150451 

struct Foo {
    int a;
};
int main() {
    Foo* foo = new Foo();
    foo->a = 7;
    delete foo;
    Foo* new_foo = new Foo(); <pre name="code" class="cpp" style="font-size: 12.727272033691406px; line-height: 18.99147605895996px;">    cout << new_foo->a << endl;
delete new_foo; return 0;}

 
a值将初始化为0 

当Foo不是POD类型时,new Foo,new Foo()都不会初始化,示例如下:

class Bar {
    public:
    int a;
	//Bar* str;
    string name; // not a POD type
};
int main() 
{
    Bar* foo = new Bar;
    foo->a = 7;
    delete foo;
    Bar* new_foo = new Bar;
    cout << new_foo->a << endl;
    delete new_foo;
    Bar* foo1 = new Bar();
    foo1->a = 7;
    delete foo1;
    Bar* new_foo1 = new Bar();
    cout << new_foo1->a << endl;
    delete new_foo1;
    return 0;
}
VS中输入结果都为 -842150451

Foo f2()的问题:

问题:一个拥有默认构造函数的类,当在栈上构造该类的一个实例时,变量名后面需不需要加一对空括号?

答案:不需要、也不能加空括号

如果紧接着追问下去:如果加了空括号,会有什么后果?编译器是报一个错误还是让它顺利通过编译?

从语法上讲,加了空括号并没有错误,这是一条完全符合语法的语句,示例如下:

class Foo {
    public:
        void execute();
    };
    
int main() 
{
     Foo f1;         //在栈上构造一个Foo对象的实例,名为f1
     Foo f2();       //完全正确的语法:声明一个函数原型,它没有参数,并且返回一个Foo的实例
     f1.execute();
     f2.execute();   //编译错误
}

上面这段示例代码,Foo f2(); 是声明了一个函数原型。那么编译器会给出一个警告,它认为你声明了一个函数原型,但没有使用这个函数;如果加上f2.execute();则编译器会报一个编译错误,原因很明显:f2只是一个函数名,而不是类、结构或联合(的实例)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值