C/C++
文章平均质量分 73
diudiuyoung
这个作者很懒,什么都没留下…
展开
-
内存管理
内 存 分 配 方 式 有 三 种 :( 1 ) 从 静 态 存 储 区 域 分 配 。 内 存 在 程 序 编 译 的 时 候 就 已 经 分 配 好 , 这 块 内 存 在 程 序 的整 个 运 行 期 间 都 存 在 。 例 如 全 局 变 量 , s t a t i c 变 量 。( 2 ) 在 栈 上 创 建 。 在 执 行 函 数 时 , 函 数 内 局 部 变 量 的 存 储转载 2014-09-22 20:03:39 · 363 阅读 · 0 评论 -
虚函数的重载和重新定义
对于虚函数的重载,若在派生类中仅改变函数返回值,则编译器不允许!(这与非虚函数不同,非虚函数在派生类中若只改变返回值,是允许的,且隐藏基类的所有同函数名的版本) 其他情况则和非虚函数相同,只要派生类中对基类虚函数重新定义(函数体改变或参数类型或参数个数改变),基类的所有同函数名的重载版本均被隐藏,只有派生类中的重新定义的版本可直接使用!#include #include #inc原创 2015-04-09 21:29:32 · 1667 阅读 · 0 评论 -
单一继承下虚函数覆盖时vftb的排列
#include #include #include #include using namespace std;//单一继承下有虚函数覆盖//派生类只有一个虚函数表,派生类对象只有一个虚指针来指向这个虚函数表。//虚函数表中按照基类虚函数(若派生类override基类的虚函数,则虚函数表中原先存放的基类虚函数的地址变为相应的派生的虚函数的地址)、派生类新增的虚函数顺序依次排列。原创 2015-04-25 09:57:02 · 441 阅读 · 0 评论 -
多继承无虚函数覆盖下的vftb排列
#include #include #include #include using namespace std;//多继承(无虚函数覆盖)//1) 每个父类都有自己的虚表,有多少个父类就有多少个虚指针//2) 子类的虚函数地址被放到了第一个父类的虚函数表中(排列顺序:先基类虚函数地址后子类虚函数地址)。(所谓的第一个父类是按照声明顺序来判断的)class Base1{pub原创 2015-04-25 12:54:32 · 422 阅读 · 0 评论 -
单一继承下基类private虚函数
单一继承下基类private虚函数在派生类中能否访问??在用户程序中,派生类对象的虚指针指向的虚函数表中是仍然有基类private虚函数的条目,但是由于属性为private,无法实现正常的访问!//通过得到private虚函数的地址强制访问说明其确实存在于子类的虚函数表中!事实上,多态性与将实现多态的函数的访问限定符没有任何关系,private 函数仍然可以实现多态,它的指针仍然位原创 2015-04-25 11:13:57 · 554 阅读 · 0 评论 -
多继承(含虚函数覆盖)vftb中虚函数排列
#include #include #include #include using namespace std;//多继承(有虚函数覆盖)//1) 每个父类都有自己的虚表,有多少个父类就有多少个虚指针//2) 子类的所有虚函数地址被放到了第一个父类的虚函数表中(排列顺序:先基类虚函数地址后子类虚函数地址,若覆盖了第一个父类中的虚函数, 则地址变为派生类override的原创 2015-04-25 13:24:29 · 404 阅读 · 0 评论 -
memcpy函数的实现
实现void *memcpy(void *to, const void *from, size_t count)首先对这个函数做一些说明。#include void *memcpy(void *to, const void *from, size_t count)函数memcpy()从from指向的数组向to指向的数组复制count个字符。如果两数组重叠,不定义函数的行为。说明:1、f转载 2015-05-08 16:25:10 · 390 阅读 · 0 评论 -
进程间的通信方式
这部分参考文献2:详细内容打开链接看 程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标。可以使用两种技术来达到协调。第一种技术在具有通信依赖关系的两个进程间传递信息。这种技术称做进程间通信(interprocess communication)。第二种技术是同步,当进程间相互具有合作依赖时使用。这两种类型的依赖关系可以同时存在。一般而言,进程有单独的地址空间。我们可以了转载 2015-05-07 15:13:45 · 271 阅读 · 0 评论 -
基类和派生类非虚函数和成员变量的同名
对于子类和父类如果拥有同名的data member 或者non virtual 成员函数,会如何处理?如果data member是static类型的又有何不同?(实际上体现了对继承的深刻理解) 对于这样的同名non virtual 函数或者 成员,实际上由指针或者对象的类型决定了访问的具体是哪个?如果使用子类类型的对象或指针,则只能看到子类里的哪个函数或者成员,对于父类里的函数则会产原创 2015-04-09 21:23:09 · 568 阅读 · 0 评论 -
单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取(二)
#include #include #include #include using namespace std;//单一继承下无虚函数覆盖//派生类只有一个虚函数表,派生类对象只有一个虚指针来指向这个虚函数表。虚函数表中按照基类虚函数、派生类新增的虚函数顺序依次排列。//直接使用三级指针,第二次解引用时可以直接访问到虚函数地址。不需要像前面博客中一步步的类型转换。class原创 2015-04-24 18:53:45 · 264 阅读 · 0 评论 -
单一继承下无虚函数覆盖__虚函数表中的虚函数指针的获取
#include #include #include #include using namespace std;//单一继承下无虚函数覆盖//派生类只有一个虚函数表,派生类对象只有一个虚指针来指向这个虚函数表。虚函数表中按照基类虚函数、派生类新增的虚函数顺序依次排列。//要注意的是一旦将指针p转换成void*(或void**)时,*p(或**p会由于编译器不知道指向内存大小而出错原创 2015-04-24 17:36:21 · 375 阅读 · 0 评论 -
关于一个int *ptr=(int *)(&a+1)问题的探讨
main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}输出为:2,5请解释以上代码的输出结果。答案如下:*(a+1)其实很简单就是指a[1],输出为2.问题关键就在于第二个点,*(ptr-1)输出为多少?解释如下,&a+1不是首地址+1,系统转载 2014-09-25 16:58:02 · 297 阅读 · 0 评论 -
关于或运算的一个题目
如果x = 2014,下面函数的返回值是(23) //二进制(unsigned int 32位)中0的个数。 int fun(unsigned int x) {int n = 0;While(x+1){n++;x=x|(x+1);} return n;}While循环终止的条件:当while循环里的x计算到unsigned int的最大值(即0转载 2014-09-25 16:59:23 · 365 阅读 · 0 评论 -
仿函数
一.仿函数,即行为类似函数的对象。又称为function object,实际上就是重载了()运算符例如class X{ public:return-value operator()(args) const { }}假如我们要实现一个函数int function(args1,args2);我们需要这么做X fo;fo(args1,arg转载 2015-03-19 17:09:07 · 419 阅读 · 0 评论 -
static/static const 的初始化
注意3点:1、类中的static 型 成员必须在类外部 初始化;2、类中的static const 型成员,若是整数型别(泛指),则既可以在类中也可以在类外初始化;若是非整数型别,只能在类外初始化;3、在类外部初始化不能加static关键字。原创 2015-03-16 21:28:37 · 229 阅读 · 0 评论 -
二进制中1的个数
//算法复杂度只与1的个数有关int main() { int num,i =0; cin>>num; //将num的二进制中从低位到高位中的1逐一变为0,当1均被处理,num变为0,退出while。 while (num) { num -= num&(-num); // 与该语句实现同样功能的转载 2015-03-10 16:57:38 · 236 阅读 · 0 评论 -
explicit关键字
http://www.cnblogs.com/ymy124/p/3632634.html首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来转载 2015-04-12 10:12:47 · 320 阅读 · 0 评论 -
静态链接库和动态链接库
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE独立的 DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包转载 2015-04-08 15:58:46 · 243 阅读 · 0 评论 -
一级指针和二级指针
#include using namespace std;int main(){ // q指向的3个连续int的内存的首地址,也即第一个int的地址。 int *q = (int*)malloc(3*sizeof(int)); cout<<q<<endl; //这三个int中第一个int的地址 //q+1指向的是第二个int的内存地址(而不是q所指3个int内存空间之后的第4个i原创 2015-04-15 16:45:15 · 260 阅读 · 0 评论 -
struct对齐方式
结构体的内存分配原则 原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开转载 2015-04-12 16:51:36 · 337 阅读 · 0 评论