c++对象模型 视频的实际操作

 note:

1.虚函数有虚指针,所以是4,不管有几个虚函数,

都只有一个vptr来存放调用的虚函数的地址。

2.子类的内存是父类内存的加自己的数据内存。

3.class类型的动态数组的初始化调用类的默认构造函数。

4.sizeof(Foo[5])=5*sizeof(Foo) array前面多了一个count,编译器才知道要调几个构造和析构。

// test4.cpp : 定义控制台应用程序的入口点。
// #include <iostream>
using namespace std; class Foo
{
public:
int id;//4
long data;//4
string str;//32 public:
Foo():id(0)
{
cout<<"default ctor.this="<<this<<",id="<<this->id<<endl;
}
Foo(int i):id(i)
{
cout<<"ctor.this="<<this<<",id="<<id<<endl;
} //virtual
~Foo() {cout<<"dtor.this="<<this<<",id="<<id<<endl;} static void* operator new(size_t size);
static void operator delete(void* phead,size_t size);
static void* operator new[](size_t size);
static void operator delete[](void* phead,size_t size);
}; void* Foo::operator new(size_t size){//size=40
Foo* p=(Foo*)malloc(size);
cout<<"Foo::operator new(size_t size) "<<size<<endl;
return p;
} void Foo::operator delete(void* phead,size_t size){
cout<<"Foo::operator delete(void* phead,size_t size)) "<<phead<<","<<size<<endl;
free(phead);
} void* Foo::operator new[](size_t size){
Foo* p=(Foo*)malloc(size);
cout<<"Foo::operator new[](size_t size) "<<size<<endl;//size=40*5+4=204,4字节用来存放指针,指针里的内容是数组的长度
return p;
} void Foo::operator delete[](void* phead,size_t size){
cout<<"Foo::operator delete[](void* phead,size_t size)) "<<phead<<","<<size<<endl;
free(phead);
} int main()
{ cout<<sizeof(Foo)<<endl;//40
Foo* p=new Foo(7);// 先operator new(sizeof(Foo))分配40个字节,再调构造函数
cout<<endl;
delete p;//先调初始化为7的析构函数,再调operator delete(p,sizeof(Foo))释放40个字节
cout<<endl;
//cout<<sizeof(Foo[])<<endl; //非法
cout<<sizeof(Foo[5])<<endl; //40*5=200
Foo* pArray=new Foo[5]; // 先operator new(sizeof(Foo[5])+sizeof(Foo*))分配204个字节, 再调5个默认构造函数
cout<<endl;
delete[] pArray;//先调最后一个构造的数组元素,最后释放存放Foo的指针,size=40
cout<<endl;
cout<<endl; //////////////::new Foo(7)全局动态分配 跳过前面的重载
//Foo* p=::new Foo(7);//“p”: 重定义;多次初始化
Foo* p2=::new Foo(7);
cout<<endl;
::delete p;
cout<<endl;
//Foo* pArray=::new Foo[5]; // “pArray”: 重定义;多次初始化
Foo* pArray2=::new Foo[5];
cout<<endl;
::delete[] pArray; system("pause");
return 0;
}

输出

最新文章

  1. UML类图(下):关联、聚合、组合、依赖
  2. 用clock()函数计算多项式的运行时间
  3. webView文本长按显示英文
  4. 有用的.NET库
  5. SpringMVC @RequestBody接收Json对象字符串 demo
  6. IE6 + png24 透明图片(滤镜)
  7. C++Builder和VC的比较
  8. 设置 Linux 文件和文件夹权限的方法
  9. C#迭代语句
  10. Linux环境下使用图形化界面的SVN客户端软件-RabbitVCS
  11. 视频录制SurfaceView
  12. MySQL5.6-Tomcat7环境变量的配置
  13. Python单元测试——深入理解unittest
  14. 前端工程之node基础
  15. Codeforces Round #411 (Div. 2)
  16. VM虚拟机安装centos详细图文教程
  17. Asp.net core 3.0
  18. 全系列Unity4.x.x到2017.1.1破解Win&amp;Mac!最新Unity2017.1.1p3&amp;4.7.2f1破解!
  19. slf4j日志的使用
  20. 解决celipse中mybatis使用的时候xml没有提示的问题

热门文章

  1. Python学习笔记(socket)
  2. 洛谷 P3931 SAC E#1 - 一道难题 Tree
  3. NOI2015品酒大会 后缀数组
  4. AD中添加中文字符丝印的方法:
  5. C. An impassioned circulation of affection DP
  6. 如何更改Android的默认虚拟机地址
  7. MVC3 自定义的错误页
  8. 手动添加日期到mysql数据库
  9. 小米OJ刷题日志
  10. Cannot load JDBC driver class &#39;com.mysql.jdbc.Driver解决方法