`
ErinToJerry
  • 浏览: 55405 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

C++成员函数的存储方式

阅读更多

思考题:

    我们可以说,静态数据成员和静态成员函数时类的一部分,而不是对象的一部分(谭老师说的)。

    那么,对于非静态成员函数来说,又是怎样的呢?

 

回答:

      我们先来成员函数的存储方式。

      我们都知道,一个类包含数据和函数。当我们实例化一个对象的时候,因为这个对象是用类定义的,那么它理所当然拥有了这个类的数据和函数。但是,一般情况下,不同的对象,他们的的数据值不同,但是函数的代码都相同。所以,为了节约存储空间(想象一下我们如果定义了100个对象,那么用100段内存空间存储相同的代码,岂不是很浪费?),我们让成员函数的代码共享。

      我们把成员函数的代码存储在对象空间之外。换句话说,成员函数的代码,都不占据对象的存储空间。它会被存在其他地方。

      所以类的成员函数,对于类来讲。一方面是逻辑上的“属于”,一方面是物理上的“不依赖“。

      回到思考题上来,对于非静态成员函数来说,它当然是对象的一部分。(只是因为存储方式上的特殊性,容易让人误解!)

 

实例:

      我们来举一个例子,说明,成员函数的代码没有存放在C++编译器为对象申请的内存空间中。

 

 

//////////////////////////////////////////////////////////////////////////
// author : Erin
// date : 20100721
// introduction : reveal the storing way of MemberFunction of a Class
//////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include <iostream>
using namespace std;
class Time
{
private:
	int hour;
	int minute;
	int sec;
	void setTime(int a, int b, int c)
	{
		hour = a;
		minute = b;
		sec = c;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	cout << "The Byte Number of 'Time' is :" << endl;
	cout << sizeof(Time)  <<endl;
	return 0;
}

 

       这是一个win32控制台工程,实现截图如下:


 

 

 

     sizeof 方法用于求类的字节数。由此可知Time类对象(如果实例化的话)的字节数为12。已知int类对象的字节数为4,即有sizeof(int)=4。故知一个对象所占的内存空间大小只取决于该对象中数据成员所占空间,而与成员函数无关

 

 

  • 大小: 10.7 KB
分享到:
评论
2 楼 blueclouds 2010-09-25  
图片不好贴,结果如下:
#############################################
4tt
1bb
4dt
#############################################

还有很多可以修改和学习的地方,我也没搞懂,学习而已!
1 楼 blueclouds 2010-09-25  
有问题啊!看看下面的这段代码(C++):
#include <iostream>
#include <complex>
using namespace std;
class Base
{
public:
	Base(){cout<<"aaaaa"<<endl;	}
	~Base(){cout<<"aaaaa~"<<endl;	}
//	virtual void f(int){cout<<"aaaaaint"<<endl;	}
	virtual void f(double){cout<<"aaaaadl"<<endl;	}
	void f0(int i=10){cout<<"aaaaa10"<<endl;	}
//	void f1(int i=10){cout<<"i=10"<<endl;}
};

class Derived //: public Base
{
public:
	Derived(){cout<<"dddd"<<endl;	}
	~Derived(){cout<<"ddddd~"<<endl;	}
	void f(complex<double>){cout<<"complex<double>"<<endl;	}
	void f2(int i=20){cout<<"i=20"<<endl;}
};
class destruct: public Base, public Derived
{
public:
	virtual void fdt(int i=20){cout<<"i=20"<<endl;}
	
};
int main()
{
cout<<"#############################################"<<endl;
	cout<<sizeof(Base)<<"tt"<<endl;
	cout<<sizeof(Derived)<<"bb"<<endl;
	cout<<sizeof(destruct)<<"dt"<<endl;
cout<<"#############################################"<<endl;
	return 0;
}


按你说的输出结果是多少?

相关推荐

Global site tag (gtag.js) - Google Analytics