404 Not Found

Personal Notes


  • 首页

  • 归档

  • 标签

  • 搜索

C++虚拟继承下对象的内存布局:GCC实现

发表于 Apr 8 2015

《深入探索C++对象模型》第3章中提到,一种实现虚拟继承的方法是:在virtual function table中放置virtual base class的offset,这样virtual function table可经由正值和负值来索引。如果是正值,索引到virtual functions;如果是负值,则索引到virtual base class offsets。GCC正是采用了类似的实现方式,我写了如下程序进行了测试:

  • 图1是4个类的继承关系图:其中Y、Z虚拟继承自X,A多重继承自Y和Z。

图 1:继承关系
阅读全文 »

C++中Overload、Overwrite和Override的区别

发表于 Apr 14 2014

1、Overload(重载):几个函数使用相同的名字,但参数或返回值不同:

  • 相同的范围(在同一个类中)
  • 函数名字相同
  • 参数不同(若只有返回值不同,则不能构成重载)
  • virtual关键字可有可无

2、Override(覆盖):派生类函数覆盖基类函数:

  • 不同的范围(分别位于派生类与基类)
  • 函数名字相同
  • 参数相同(返回值类型也要相同)
  • 基类函数必须有virtual关键字

3、Overwrite(重写):派生类的函数屏蔽了与其同名的基类函数:

  • 不同的范围(分别位于派生类与基类)
  • 函数名字相同(返回值类型可以不同)
  • 若参数不同,不论基类函数有无virtual关键字
  • 若参数相同,基类函数无virtual关键字
    阅读全文 »

C语言函数的变长参数表

发表于 Apr 14 2014

C语言中的printf函数的完整声明为:

int printf(char *fmt, ...);

其中,省略号表示参数表中参数的数量和类型是可变的,并且省略号只能出现在参数表的尾部。这里编写一个与printf函数功能类似的函数miniprintf来演示变长参数表的实现,声明如下:

void miniprintf(char *fmt, ...);

标准头文件<stdarg.h>中包含了一组宏定义,它们对如何遍历参数表进行了定义:

  • va_list类型用于声明一个变量,该变量将依次引用各参数,程序中即ap
  • 宏va_start将ap初始化为指向第一个无名参数的指针。在使用ap之前,该宏必须被调用一次。参数表必须至少包括一个有名参数,va_start将最后一个有名参数作为起点
  • 每次调用va_arg,该函数返回一个参数,并将ap指向下一个参数。va_arg使用一个类型名来决定返回的对象类型、指针的移动步长。
  • va_end在函数返回之前调用,做一些清理工作
    阅读全文 »

C语言数据块读写函数:fread和fwrite

发表于 Mar 5 2014

1、fread和fwrite函数的定义

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp);
size_t fread(const void *ptr, size_t size, size_t nmemb, FILE *fp);

  • ptr:缓冲区的首地址,对fread来说,它是读入数据的存放地址;对fwrite来说,是要输出数据的地址。
  • size:要读写的字节数。
  • nmemb:要进行读写多少个size字节的数据项。
  • fp:文件结构指针。
  • 返回值是实际写入的nmemb数目。
    阅读全文 »
1…89
wind4869

wind4869

44 日志
12 标签
GitHub E-Mail
© 2014 - 2020 wind4869
由 Hexo 强力驱动
主题 - NexT.Pisces
0%