原文请参考:深度探索C++对象模型之(三)
请关注:JellyThink | 思想的果冻
C++中的多肽这个概念,如果往开了说,那就太广了,而很多时候又有很多的地方,我们在实际开发中没有用到,所以记录最简单的,最实用的C++多肽概念和用法,最后得到一个升华。
有下述代码一段:
#include <iostream> using namespace std; class A { public: A(){} virtual ~A(){} virtual void print() { cout<<"I am from class A"<<endl; } }; class B:public A { public: B(){} ~B(){} void print() { cout<<"I am from class B"<<endl; } }; void call(A a3, A *a4, A &a5) { (*a4).print(); // call whose print??? a5.print(); // call whose print??? a3.print(); // call whose print??? } int _tmain(int argc, _TCHAR* argv[]) { A *a1 = new B(); a1->print(); // call whose print??? A a2; a2.print(); // call whose print??? B b2; call(b2, &b2, b2); delete a1; return 0; }
在上述代码中标注的call whose print???,如果都能正确的回答出,就对这里的知识点有很好的掌握。经过指针和引用完成的两个函数的调用会被动态的完成,也就是说(*a4).print()和a5.print()在执行期间是无法决定调用哪个print()函数的;为什么a3.print()总是调用A类的print()函数呢?为什么是动态决定的?请参见后续的(深度探索C++对象模型之(四))
一个class object到底需要多少内存才能放下呢?关于这个问题,真的很重要,因为编程,归根到底就是对内存的处理,如果对类对象的内存分布有很好的掌握,那么学习C++是件很容易的事情,处理bug也是很容易的,写出效率高的程序也是指日可待的,因为写出效率高的程序还要更多的练习。
这里,永远记住一条,一个指针,不管指向的是什么数据类型,指针本身所需要的内存字节是固定的(4个字节);通常,一个引用是以一个指针来实现的,后续的博文会对引用是以一个指针来实现的进行更详细的讲解。
以下的这个类,需要多少内存空间来建立一个对象:
class Test { public: Test(){} virtual ~Test(){} virtual void print() { cout<<"Test"<<endl; } static int count; protected: int number; // 4 char *name; // 4 private: int numberofcomponent; // 4 char *address; // 4 };
class Test { public: Test(){} virtual ~Test(){} virtual void print() { cout<<"Test"<<endl; } static int count; protected: int number; // 4 char *name; // 4 private: int numberofcomponent; // 4 char *address; // 4 char sex; // 1 };
现在需要多少内存空间呢?你会说17?21?No.NO.都不会,再想想一个class object到底需要多少内存空间的第3点。如果再把类中的virtual关键字去掉呢?那会需要多少内存空间呢?对于一个class object对内存的占用,后续还会进行更深层次的讨论,这些内容是每一个C++程序员必须会,不得不会的内容。
原文请参考:深度探索C++对象模型之(三)
请关注:JellyThink | 思想的果冻
2013/1/2 于东软大连