new Foo 和 new Foo()的区别以及Foo f2()的问题
new Foo 和 new Foo()的区别:
问题是:在C++中,以下两者有何不同
- new Foo;
- 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()的问题相关推荐
- foo:function(){}与function foo(){}还有foo=function()三者间的区别
首先要分清楚的是: 第一种其实是定义了一个名为foo的属性,然后给这个属性赋了一个匿名函数(function就是这个匿名函数的定义),也只能在一个定义好的方法或者类中才行,因为其相当于定义的是一个属性 ...
- foo php,php – $foo === TRUE和TRUE === $foo有什么区别?
我明白,在下面的代码中-- $foo = TRUE; $bar = 1; if ($foo === TRUE) { echo 'Foo'; } if ($bar === TRUE) { echo 'B ...
- new new Foo().getName()面试题解析
经典面试题 Foo().getName() 解析 题目如下,写出输出内容(注释:abcde为步骤标号,便于下边分析定位) // a. function Foo () {getName = functi ...
- js中的经典题Foo.getName
js中的经典题Foo.getName Foo.getName所涉及到的知识点 先看看题目代码: Foo.getName所涉及到的知识点 先看看题目代码: function Foo() { getNam ...
- java创建两个foo方法_Java类实例化原理 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...
Java对象的创建过程包括类初始化(类实例化两个阶段. 一.Java对象创建时机 (1)使用new关键字创建对象 (2)反射创建对象 使用Class类的newInstance方法 Student st ...
- 使用grep进行负匹配(匹配不包含foo的行)
我一直在试图找出这个命令的语法: grep ! error_log | find /home/foo/public_html/ -mmin -60 要么 grep '[^error_log]' | f ...
- 编程中常见的Foo是什么意思
不管是java,C++,还是PHP,每次都能看到 foo = bar 的例子,这两个单词很恶心,foo查不到字典,bar的解释又让人跟编程联系不上,更弄不清楚这个神秘的foo是个什么关系. 语意不清, ...
- 变量foo 和 bar的由来
在计算机程序设计与计算机技术的相关文档中,术语foobar是一个常见的无名氏化名,常被作为"伪变量"使用. 单词"foobar"或分离的"foo&qu ...
- Foo,getName题解分析
题目 function Foo() {getName = function () { alert (1); };return this; } Foo.getName = function () { a ...
最新文章
- 文件系统管理 之 Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍...
- linux系统怎么关闭usb端口,linux系统挂载以及卸载USB接口的设备的解决办法
- unity3d能和java系统整合吗_Android与Unity3d的整合
- 偷梁换柱——揭开多态的面纱
- java数据结构编程_Java数据结构编程
- 最长单调子序列及计数(poj1952)
- java自动识别验证码_Java使用OCR技术识别验证码实现自动化登陆方法
- mysql 创建表_每天10分钟带你学会MySQL(三)表的创建
- 刚入行程序员,未来怎么走?
- feign调用service_Spring-cloud-eureka使用feign调用服务接口
- dbForge Studio for SQL Server入门教程:如何创建和编辑查询
- 《数据结构》C语言版 (清华严蔚敏考研版) 全书知识梳理
- 【dsPIC33】振荡器与定时器
- 聚焦新生代 戮默科技创造正向价值
- H5 查看大图。缩放图片
- CSS选择器补充,CSS三大特性以及字体、文本样式。
- arcgis 将地图点转换为屏幕坐标_ArcGIS中自定义坐标系转换
- Win10系统bhound7.sys蓝屏故障修复
- 【转】2023年Java学习路线图-黑马程序员
- HTTP状态码--1XX