Cpp 对象模型探索 / new 对象时加括号和不加括号时的差别
一、结论
CTest *pt1 = new CTest();
CTest* pt2 = new CTest;
1、若类 CTest 是空类,则二者 new 的结果没有区别。
2、若类存在显示声明的缺省的构造函数,则二者 new 的结果没有区别。
3、若类没有显示声明的缺省的构造函数,即使编译器为类创建了缺省的构造函数,二者的结果依然不一样。带括号的结果是会将 pt1 的 count_ 初始化为0,而不带括号的结果是不初始化 count_ 。
二、验证
1、对于空类,其对象只占1B,两种申请方式没有区别。
2、对于类存在显示声明的缺省的构造函数,两种 new 的时候都会调用该构造函数,所以对于 new 的结果没有影响。
#include <iostream>class CTest
{
public:CTest(){count_ = 0;}
public:size_t count_;
};int main()
{CTest *pt1 = new CTest();CTest* pt2 = new CTest;std::cout << "()::count_ = " << pt1->count_ << std::endl;std::cout << "count_ = " << pt2->count_ << std::endl;std::cin.get();return 0;
}
结果
()::count_ = 0
count_ = 0
3、对于没有显式声明构造函数的类,即使编译器自动生成了一个构造函数,二者 new 的结果也是不同的。带括号的 new 会对类中成员变量进行初始化,而不带括号的 new 则不采取任何操作。
#include <iostream>class CTest
{
public:size_t count_;
public:virtual void func(){}
};int main()
{CTest *pt1 = new CTest();CTest* pt2 = new CTest;std::cout << "()::count_ = " << pt1->count_ << std::endl;std::cout << "count_ = " << pt2->count_ << std::endl;std::cin.get();return 0;
}
结果
()::count_ = 0
count_ = 3452816845
(SAW:Game Over!)
Cpp 对象模型探索 / new 对象时加括号和不加括号时的差别相关推荐
- Cpp 对象模型探索 / 系列文章的索引
一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...
- Js函数加括号、不加括号
Js函数加括号.不加括号 (function a(){}) (命名函数表达式)会返回这个函数(不会执行),但是在括号外面无法调用该函数,需要一个变量接收这个函数,var fun = (function ...
- Js事件绑定时,函数名加括号和不加括号有什么区别
Js事件绑定时,函数名加括号和不加括号有什么区别以window.onload为列 大致可以理解为一:不加括号时:=指向函数,触发事件时触发函数.window.οnlοad=aa;aa为一个函数等价于w ...
- js中方法调用加括号和不加括号的区别
前言 一个页面需要使用到setInterval和setTimeout.使用过程中对于方法的调用出现了加括号和不加括号的区别,当然在其他的场景也有发生,window.load = init等等 区别 以 ...
- v-on:click(简写@click)绑定事件加括号和不加括号
如果事件绑定的方法没有参数可以选择加括号也可以不加括号
- js构造函数加括号与不加括号的区别
//首先定义一个构造函数Hello function Hello(){ alert(1): } //定义一个函数表达式 var getName = function(){ alert(2): } // ...
- Cpp 对象模型探索 / 静态局部对象只构造一次的原因和执行析构的方法
代码 class A { public:A() {}~A() {} };void func() {static A a; }int main() {func();return 0; } 问题 1.函数 ...
- Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)
源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...
- Cpp 对象模型探索 / 编译器为对象创建缺省析构函数的条件
1.基类中含有析构函数的子类,编译器为子类创建析构函数. 2.类成员变量是类对象,该类对象含有析构函数,则编译器为子类创建析构函数. 代码 class Parent { public:~Parent( ...
最新文章
- Power Network [POJ - 1459]
- Google瓦片地图算法解析
- mysql wampmysqld_wamp中mysqld占用内存大mysql5.6 | 学步园
- 基于jsp的网上商城_[源码和文档分享]基于S2SH框架的JSP和MySQL的网上商城系统
- windows与虚拟机的linux共享一个文件夹
- 阿里云服务器mysql默认密码_阿里云服务器修改MySQL初始密码---Linux学习笔记
- 斐波那契查找(Fibonacci Search)和折半查找
- Checking if your code is running on 64-bit PHP
- CentOS 6.5 x64 Redis 安装
- Java知识积累——参数个数可变的函数(Varargs)
- SQL Server 2008 卸载报错
- 扫描仪怎样装无线网络服务器,怎么设置打印机IP地址和安装扫描仪。
- 企业计算机网络安全威胁及措施
- target triplets
- python n个list如何组成矩阵_使用Python并行框架Dask处理和分析大规模时空数据
- Markdown整理备忘(一)-- 符号整理
- Linux--Ubuntu Tweak
- 周鸿祎谈5G时代网络安全:手机病毒可能会更猖狂
- 奶爸日记 - 祝你生日快乐
- 黑、黄教堂等试音碟及其他
热门文章
- 2016/08/24 CppCon 2015 Bjarne Stroustrup “Writing Good C++14
- 转载收藏之用 - 微信公众平台开发教程(三):微信公众平台开发验证
- java的finally_java的finally用法
- 【收藏】在QGIS中导入GOOGLE、BING等地图和卫星影像(插件方式和XYZ方式)
- Spark宽依赖:根据宽依赖切分stage
- HDFS修改副本数并生效
- JVM调优:图解对象内存分配过程
- Spring Boot 2.x整合Apollo代码示例
- Java集合常见数据结构-栈/队列/数组/链表/红黑树
- 【示例】Lucene查询索引库编程步骤