静态成员函数学习小结(待续)

来源:互联网 发布:淘宝真人秀大尺度 编辑:程序博客网 时间:2024/05/22 13:50

第一个问题,静态成员函数是放在内存中的哪个位置的?
要回答这个问题,首先对c++内存机制做一个简单的介绍。

C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code area),栈区(stack
area),堆区(heap area)(即自由存储区)。全局数据区存放全局变量,静态数据和常量;所有类成员函数和非成员函数代码存放在代码区;为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区;余下的空间都被称为堆区。根据这个解释,我们可以得知在类的定义时,类成员函数是被放在代码区,而类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的。对于非静态成员变量,我们是在类的实例化过程中(构造对象)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。
[http://blog.csdn.net/fuzhongmin05/article/details/59112081]
静态成员函数首先是成员函数,所以其与普通成员函数均放置在代码区。既然放置在代码区,那么可以得到一个结论,如果没有调用到类的普通成员变量,那么在类实例化之前,所有的成员函数均可被类直接调用。(注意必须没有调用普通成员变量。因为普通成员变量是要在实例化的时被放在栈区的)
实验代码如下:

#include <iostream>using namespace std;class D{public:    void printA()    {        cout << "printA" << endl;    }    static void printB()    {        cout << "printB" << endl;    }};int main(void){    D *d = NULL;    d->printA();    d->printB();}

实验结果如图:
图一
由于类的指针为NULL,所以并没有为其分配内存。但仍可调用成员函数。因为他们的内存是在代码区,生命周期与类相同。所以可以直接调用。

第二个问题,静态成员函数与普通成员函数的区别
最明显的区别是,静态成员函数没有this指针,而普通成员函数有this指针。
this指针有什么用途呢?

首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。注:this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。this指针的类型取决于使用this指针的成员函数类型以及对象类型

(http://www.cnblogs.com/zhangruilin/p/5769843.html)

每一个类会生成很多对象,每个对象在不同的内存区域中。当对象调用成员函数时,成员函数如何找到该对象的内存地址呢?这里就需要this指针。普通成员函数因为隐含了this指针,所以可以随意访问成员变量。而静态成员函数没有了this指针,所以并不能够直接操作普通成员变量,必须通过传参的方式,告诉静态成员函数对象的地址,才能够操作普通成员变量。 静态成员函数省略了this指针,使得他在操作普通成员变量有诸多困难,那么为什么要设计这种函数呢?原因在于,拥有了this指针,就要跟具体的对象挂钩;没有了this指针,该函数就可以跳出具体的对象,而作为不同的对象之间通信的工具。举个例子,在设计链表时,如果用面向对象的方法,我们更希望将操作头指针的函数封装在类里面。这时用静态成员函数操作静态成员变量,就会使头指针的操作更为便利,美观。 回到之前的代码,普通成员函数可以直接用类来调用(如果该普通成员函数没有调用普通成员变量),但我认为c++这样的处理有点理论上不完美。也许后续的学习可以让我对此更加了解。