调用哪个虚函数的问题
摘要:运行结果: 分析:1)虚函数是占用空间的,含有1个虚函数的类的对象,其内部有一个虚函数指针,所以其sizeof大小为各个成员变量大小之和,在加上虚函数指针的大小(一般为4B,32位机器)。2)当通过基类指针或子类指针调用虚函数的时候,都是通过该指针当前指向的对象中的虚函数指针来调用合适的虚函数。所以,无论该指针为基类类型、子类类型,调用哪个虚函数都取决于其所指向的对象的类型(实际依赖对象中的虚函...
阅读全文
posted @
2010-08-09 20:24
︶ㄣ第二名
阅读(942)
推荐(0)
C++中的关键概念:名字查找与继承
摘要:关键概念:名字查找与继承 理解 C++ 中继承层次的关键在于理解如何确定函数调用。确定函数调用遵循以下四个步骤: 1) 首先确定进行函数调用的对象、引用或指针的静态类型。 2) 在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数或者查找完最后一个类。如果不能在类或其相关基类中找到该名字,则调用是错误的。 3) 一旦找到了该名字,就进行常规类型检查,查看如果...
阅读全文
posted @
2010-08-06 17:55
︶ㄣ第二名
阅读(1515)
推荐(0)
模板类的 友元模板函数
摘要:1)需要注意的是,template<class T>究竟哪里应该出现,哪里不应该出现。2)需要重点注意的是添加注释的行, 此行不可也写成, 写成这样也不可, 总之,唯一正确的写法就是代码段中的写法。<>也必不可少,其实<>有两重意思,一是,表明此友元函数是函数模板;二是,此模板使用的模板类型参数为当前模板类的类型参数class T。
阅读全文
posted @
2010-08-05 20:13
︶ㄣ第二名
阅读(1946)
推荐(0)
虚函数的默认参数是静态绑定
摘要:1: #include<iostream> 2: #include<string> 3: using namespace std; 4: class Base 5: { 6: public: 7: virtual void Speak(string str="Base class") 8: { 9: cout<<"In base clsss ,the defau...
阅读全文
posted @
2010-08-05 16:12
︶ㄣ第二名
阅读(523)
推荐(0)
malloc/free和new/delete的异同
摘要:1)malloc与free是C/C++语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。2)对于非内部数据类型而言,只用malloc/free无法满足动态对象的要求。动态对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/freee是库函数而不是运算符,不在编译器的控制权限之内,不能把执行构造函数和析构函数的任务强加于m...
阅读全文
posted @
2010-06-21 16:42
︶ㄣ第二名
阅读(324)
推荐(0)
关于取数组地址
摘要:运行结果为:2 5 注意第二行,取数组a的地址,之后加1,(&a + 1); 指针移动一个数组的大小的距离,实际上指向了超出数组a末尾元素的位置。
阅读全文
posted @
2010-06-21 16:20
︶ㄣ第二名
阅读(405)
推荐(1)
函数指针的声明、初始化、使用
摘要:输出: 说明:函数指针初始化时,可以直接用函数名初始化,也可以取函数地址初始化。通过函数指针调用函数时,可以解引用指针,也可以直接使用。
阅读全文
posted @
2010-06-13 15:32
︶ㄣ第二名
阅读(8390)
推荐(0)
继承时的覆盖问题
摘要:程序的输出结果为:1 2。子类中的ival覆盖掉了父类中同名的成员变量,但是子类继承了父类的print函数,此函数打印的应该是父类中被覆盖的ival的值,也就是1。在执行子类的构造函数体前,先调用父类的构造函数。
阅读全文
posted @
2010-06-13 11:08
︶ㄣ第二名
阅读(331)
推荐(0)
含有虚函数的类sizeof大小
摘要:输出: 说明:1)一个类中若有虚函数,(不论是自己的虚函数,还是继承而来的),那么类中就有一个成员变量:虚函数指针,这个指针指向一个虚函数表,虚函数表的第一项是类的typeinfo信息,之后的项为此类的所有虚函数的地址。2)假设经过成员对齐后的类的大小为size个字节。那么类的sizeof大小可以这么计算:size + 4*(虚函数指针的个数n)。代码中,DerivedFromTwo继承自2个分支...
阅读全文
posted @
2010-06-07 21:25
︶ㄣ第二名
阅读(10248)
推荐(3)
sizeof运算符
摘要:本以为自己对sizeof掌握的还不错,结果还是会因为粗心大意而错误。 1)sizeof不是函数,也不是运算符,它是一个类似宏定义的特殊关键字。sizeof后面跟类型(如int)需要加括号,跟变量不需要括号。 2)int ival = 4; 计算sizeof(a)的时候,不论a的值是什么,都会被替换成sizeof(int),结果为4。 3)如果是int ival = 4; sizeof(ival =...
阅读全文
posted @
2010-06-07 19:58
︶ㄣ第二名
阅读(937)
推荐(1)
Boost线程库学习笔记
摘要:一、创建一个线程创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针。并且这个函数无参数,并返回void类型。 当一个thread执行完成时,这个子线程就会消失。注意这个线程对象不会消失,它仍然是一个还处在它的生存期的C++对象。同理,当对一个堆上的线程对象的指针调用delete时候,线程对象被销毁,操作系统的线程并不能保证就...
阅读全文
posted @
2010-06-06 19:48
︶ㄣ第二名
阅读(21882)
推荐(8)
结构体、类的成员对齐
摘要:自然对齐 为了保证CPU的运算稳定和效率,要求基本数据类型在内存中的存储地址必须自然对齐。所谓自然对齐,就是基本数据类型的变量不能简单的存储于内存中的任意地址处,它们的起始地址必须能够被它们的大小整除。 例如,在32位平台下,int和指针类型的变量的地址应该能够被4整除。 结构体变量的自然对齐 对于复合类型(一般指结构体和类)的对象,如果它的起始地址能够满足其中要求最严格(最高)的那个数据...
阅读全文
posted @
2010-06-02 20:30
︶ㄣ第二名
阅读(571)
推荐(0)
算术运算的溢出行为 and 一个数内存中表示1的个数
摘要:说明:1)函数numOnesInBinary采用的方法对正负数通用。2)【此处有疑问】 处,本人不理解,无符号数和有符号数算术运算得出的结果应该为无符号数,为何有一个输出-1呢?哪位高手碰巧看到此文,请赐教。3)&按位与,即按内存中的表示形式按位与。任何数与-1按位与,结果是本身。算术运算的溢出问题: C语言中存在两类整数算术运算,有符号运算和无符号运算。 在无符号算术运算中,没有所谓的“...
阅读全文
posted @
2010-05-28 17:36
︶ㄣ第二名
阅读(1198)
推荐(1)
Boost Thread 编程指南、Boost线程入门教程
摘要:作者:dozb(http://dozb.bokee.com/) 标准C++线程即将到来。CUJ预言它将衍生自Boost线程库,现在就由Bill带领我们探索一下Boost线程库。 就在几年前,用多线程执行程序还是一件非比寻常的事。然而今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率;为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序;GUI应用程序将那些费时,复杂的处理以线...
阅读全文
posted @
2010-05-19 19:21
︶ㄣ第二名
阅读(4876)
推荐(2)
C++线程库
摘要:1)C++ Threads http://sourceforge.net/projects/threads/ 2)ZThread http://sourceforge.net/projects/zthread/(C++编程思想下卷介绍并发时候用的线程库) 3)Open Threads http://sourceforge.net/projects/openthreads/files/ 4)Boos...
阅读全文
posted @
2010-05-13 10:42
︶ㄣ第二名
阅读(1661)
推荐(0)
C++/C函数的调用规范
摘要:先看一个代码VS2008输出: 函数的调用规范 函数的调用规范,也称为调用约定(Calling convention)。函数的调用规范决定了函数调用时,实参压栈、退栈及堆栈释放方式,以及函数名改编(Name Mangling)的方案,也即命名规范。 Windows环境下常用的调用规范有: 1)__cdecl:这是C/C++函数默认的调用规范,参数从右向左依次传递,压入堆栈,由调用函数负责堆栈的清退...
阅读全文
posted @
2010-05-10 21:17
︶ㄣ第二名
阅读(2424)
推荐(0)
独立对象(非附属对象)大小
摘要:输出结果:1 8。解释: 一个空类的大小之所以是1,因为C++规定非附属对象的大小不能为0,所以一般编译器都以一个char来填充。第二个HoldAnInt的大小之所以为8,因为类的成员自然对齐所至,一个HoldAnInt对象的末尾,有3个填充字节(32位机器,4字节对齐的话)。HoldAnInt的内存布局为:4(int)1(Empty)3(填充字节)。
阅读全文
posted @
2010-04-28 22:08
︶ㄣ第二名
阅读(266)
推荐(0)
C++中的运行中动态类型识别RTTI
摘要:RTTI综述 C++中的2个运算符支持RTTI,即Run Time Type Identification:typeid和dynamic_cast。 RTTI实现的基石是每个类型对应的一个const type_info类型对象,它存储了这个对象的确切类型信息。注意,一个类型对应一个type_info对象,而不是一个对象。无论是基本类型还是用户自定义类型,都需要额外的内存来存放此类型对应的typ...
阅读全文
posted @
2010-04-27 19:38
︶ㄣ第二名
阅读(4819)
推荐(0)
Placement new、operator new、new operator 完全释疑
摘要:首先我们区分下几个容易混淆的关键词: new(也称作new operator)、operator new、placement new。看如下代码: 这里的new是上述三个关键字中的第一个,成为new操作符。实际上它执行如下3个过程: 1. 调用operator new分配内存2. 调用构造函数生成类对象3. 返回相应指针 placement new 是重载operator new的一个标准、全局的...
阅读全文
posted @
2010-04-26 21:03
︶ㄣ第二名
阅读(6164)
推荐(2)
C++/C小知识点(2)
摘要:负数的右移位操作 负数的>>操作,结果取决于语言的实现,左边空出的位置,可能填补0,也可能填补1。 静态局部对象 内置类型的局部对象如果没显式初始化,则值就未初始化。静态局部对象、全局对象,包括内置类型和用户自定义类型,如果未提供初始化式,则编译器自动初始化为0。 拷贝构造函数 A(A copy){…};是不允许的,如果允许,会造成无限的递归调用。正确的形参为co...
阅读全文
posted @
2010-04-25 18:57
︶ㄣ第二名
阅读(418)
推荐(0)