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对象的实例,名为f1Foo f2();       //完全正确的语法:声明一个函数原型,它没有参数,并且返回一个Foo的实例f1.execute();f2.execute();   //编译错误
}

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

new Foo 和 new Foo()的区别以及Foo f2()的问题相关推荐

  1. foo:function(){}与function foo(){}还有foo=function()三者间的区别

    首先要分清楚的是: 第一种其实是定义了一个名为foo的属性,然后给这个属性赋了一个匿名函数(function就是这个匿名函数的定义),也只能在一个定义好的方法或者类中才行,因为其相当于定义的是一个属性 ...

  2. foo php,php – $foo === TRUE和TRUE === $foo有什么区别?

    我明白,在下面的代码中-- $foo = TRUE; $bar = 1; if ($foo === TRUE) { echo 'Foo'; } if ($bar === TRUE) { echo 'B ...

  3. new new Foo().getName()面试题解析

    经典面试题 Foo().getName() 解析 题目如下,写出输出内容(注释:abcde为步骤标号,便于下边分析定位) // a. function Foo () {getName = functi ...

  4. js中的经典题Foo.getName

    js中的经典题Foo.getName Foo.getName所涉及到的知识点 先看看题目代码: Foo.getName所涉及到的知识点 先看看题目代码: function Foo() { getNam ...

  5. java创建两个foo方法_Java类实例化原理 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java对象的创建过程包括类初始化(类实例化两个阶段. 一.Java对象创建时机 (1)使用new关键字创建对象 (2)反射创建对象 使用Class类的newInstance方法 Student st ...

  6. 使用grep进行负匹配(匹配不包含foo的行)

    我一直在试图找出这个命令的语法: grep ! error_log | find /home/foo/public_html/ -mmin -60 要么 grep '[^error_log]' | f ...

  7. 编程中常见的Foo是什么意思

    不管是java,C++,还是PHP,每次都能看到 foo = bar 的例子,这两个单词很恶心,foo查不到字典,bar的解释又让人跟编程联系不上,更弄不清楚这个神秘的foo是个什么关系. 语意不清, ...

  8. 变量foo 和 bar的由来

    在计算机程序设计与计算机技术的相关文档中,术语foobar是一个常见的无名氏化名,常被作为"伪变量"使用. 单词"foobar"或分离的"foo&qu ...

  9. Foo,getName题解分析

    题目 function Foo() {getName = function () { alert (1); };return this; } Foo.getName = function () { a ...

最新文章

  1. 文件系统管理 之 Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍...
  2. linux系统怎么关闭usb端口,linux系统挂载以及卸载USB接口的设备的解决办法
  3. unity3d能和java系统整合吗_Android与Unity3d的整合
  4. 偷梁换柱——揭开多态的面纱
  5. java数据结构编程_Java数据结构编程
  6. 最长单调子序列及计数(poj1952)
  7. java自动识别验证码_Java使用OCR技术识别验证码实现自动化登陆方法
  8. mysql 创建表_每天10分钟带你学会MySQL(三)表的创建
  9. 刚入行程序员,未来怎么走?
  10. feign调用service_Spring-cloud-eureka使用feign调用服务接口
  11. dbForge Studio for SQL Server入门教程:如何创建和编辑查询
  12. 《数据结构》C语言版 (清华严蔚敏考研版) 全书知识梳理
  13. 【dsPIC33】振荡器与定时器
  14. 聚焦新生代 戮默科技创造正向价值
  15. H5 查看大图。缩放图片
  16. CSS选择器补充,CSS三大特性以及字体、文本样式。
  17. arcgis 将地图点转换为屏幕坐标_ArcGIS中自定义坐标系转换
  18. Win10系统bhound7.sys蓝屏故障修复
  19. 【转】2023年Java学习路线图-黑马程序员
  20. HTTP状态码--1XX

热门文章

  1. 高德地图Key的获取过程(详细)
  2. Word 安全模式可以启动,正常模式不能启动
  3. 食谱生成器与营养计算器的核心部分设计
  4. vue实现九宫格抽奖
  5. QlikView 学习资料
  6. amcharts4 总结
  7. 多线程扑克牌发牌小白实现 -- 记录下自己代码点滴
  8. 请不要“妖魔化”外包
  9. 09线性相关、基、维数
  10. HDU 4960:Another OCD Patient