[C/C++ Digestion] – 自底向上地探究虚函数
[C/C++ Digestion] –
自底向上地探究虚函数
作者:
Jason Lee @
http://blog.csdn.net/jasonblog
日期:
2010-05-19
环境:
Visual C++ Express
2008
声明:本文发表在
csdn
博客,如有转载,请注明出处
[1]C++
对象模型基础
一个类中可以包含静态数据成员、静态成员函数、非静态成员函数和非静态数据成员以及虚函数。其中,前三者(静态数据成员、静态成员函数、非静态成员函数)都并没有被放到对象的布局中,可以从以下两段代码得到验证:
#include <iostream>
using namespace std;
class Base {
};
int main(){
Base a;
cout << sizeof (a) << endl;// 输出1
return 0;
}
上述的
Base
类是一个空类,占据了一个字节的内存空间,这是为了保证每个类实例化后都拥有独一无二的内存空间。接着我们往
Base
类中添加静态数据成员、静态成员函数和非静态成员函数:
#include <iostream>
using namespace std;
class Base {
public :
Base(){}
~Base(){}
static int v1;
static void f1(){}
void f2(){}
};
int main(){
Base a;
cout << sizeof (a) << endl;// 仍然输出1
return 0;
}
在经过内容填充后,
Base
类的实例
a
仍然仅占据
1
个字节的内存空间,与空类无异,这说明了静态数据成员、静态成员函数和非静态成员函数并未被放在对象的内存布局当中
。
接下来往类中添加非静态数据成员:
#include <iostream>
using namespace std;
class Base {
public :
int a;
int b;
};
int main(){
Base a;
cout << sizeof (a) << endl;// 输出8
cout << hex << &a << endl;// 输出0012F 3CC
cout << hex << &a.a << endl;// 输出0012F 3CC
cout << hex << &a.b << endl;// 输出0012F 3D0
return 0;
}
从上面的代码可以看出:一,非静态数据成员是会被放到对象的内存布局中;二,数据成员是根据声明顺序有序地在内存中进行分布的;三,在没有虚函数的情况下对象所占据的内存大小就是数据成员所占据的空间之和。布局如下图:
a
b
那么如果添加了虚函数以后呢?先看一段代码:
#include <iostream>
usin
相关文档:
首先看下下面这段:
int main()
{
char *name = "fengkewei";
char name1[] = "fengkewei";
char *name2 = "fengkewei";
char *name3 = "woaifengkewei";
int i = 10;
int j = 10;
int k = 11;
return 0;
}
若您觉得它们应该都保存在内存中的一块地方,那请往下看。。。。
下面是编译器为各个变量分配的内存地 ......
和在IDE中编译相比,命令行模式编译速度更快,并可以避免被IDE产生的一些附加信息所干扰。本文将介绍微软C/C++编译器命令行模式设定和用法。 1、设置环境变量: PATH=C:\Program Files\Microsoft Visual Studio 8\VC\bin INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\include LIB=C:\Program Files\Microsof ......
用此法前确保你的C源代码是无错的~~
解决办法:
C:
在主函数后加getch()或ch=getch(); (让程序等待你按下任意键,再继续执行下面的语句)
C++:
1.包含头文件时: #include <stdlib.h>/*header file,因为在stdlib.h头文件中定义了system()函数*/
2.在最后一句加上:system("PAUSE ......