一些有关C++中静态函数的东西
以下内容大部分从网上找来
这篇文章属于介绍的比较基础的东西
http://leonguan.spaces.live.com/blog/cns!63d2328323edf129!162.entry
静态的成员函数,同静态数据成员类似,它也是属于类,而不是属于某一个对象的。
静态成员函数不能访问非静态的数据成员,它只能访问静态数据成员,也只能调用其它的静态成员函数。原因是:当前对象的地址(this)是被隐含地传递到被调用的函数的。但一个静态成员函数没有this指针,所以它无法访问非静态的成员函数。
由于静态成员函数是属于类的,所以,静态成员函数的调用方法为:
类名::静态成员函数名();
但也允许用对象或指向对象的指针调用。例如,在main()中,静态成员函数f分别被对象x和指向x对象的指针pX调用。
下面是一个应用静态数据成员和静态成员函数的例子:
在此程序中,我们将使用类 Count,它为自己的每一个对象提供了对象 ID 号。创建或销毁对象时,将有一静态数据成员记录程序中的对象数。执行结果是显示对象 ID 及对象数。
#include<iostream.h>
class Count{
private:
static int counter;
int obj_id;
public:
Count(); //constructor
static void display_total(); //static function
void display();
~Count(); //destructor
};
int Count::counter; //definition of static data member
Count::Count() //constructor
{
counter++;
obj_id = counter;
}
Count::~Count() //destructor
{
counter–;
cout<<“Object number “<<obj_id<<” being destroyed\n”;
}
void Count::display_total() //static function
{
cout <<“Number of objects created is = “<<counter<<endl;
}
void Count::display()
{
cout << “Object ID is “<<obj_id<<endl;
}
void main()
{
Count a1;
Count::display_total();
Count a2, a3;
Count::display_total();
a1.display();
a2.display();
a3.display();
}
输出:
Number of objects created is = 1
Number of objects created is = 3
Object ID is 1
Object ID is 2
Object ID is 3
Object number 3 being destroyed
Object number 2 being destroyed
Object number 1 being destroyed
此程序中,类 Count 中有一静态数据成员 counter。每次创建对象时由构造函数为此数据成员加 1。每次销毁对象时由析构函数减 1。
在 main() 中,创建对象 a1 后,我们用静态成员函数 display_total() 来显示对象的总数。调用静态成员函数所用的语法,与我们调用一般成员函数所使用的方法有所不同。仅使用类名称调用函数 display_total() ,如下所示。
Count::display_total();
静态函数 display_total() 显示已创建的对象数。当我们执行与整个类相关的某个函数时,不需要引用特定的对象。因此,我们不使用特定对象的名称,而是与带有作用域运算符的类本身的名称一起使用静态函数。在进一步定义两个类对象 a2 和 a3 后,该函数再次被调用。
成员函数 display() 输出每一对象的对象 ID 号。在构造函数中,每次创建对象时,静态变量 counter 的值被赋给数据成员 object_id。因此,每一对象具有唯一编号。这显示在输出中,如下所示:
Object ID is 1
Object ID is 2
Object ID is 3
程序执行完成后,每一对象均被销毁。您会看到,具有 ID 3 的对象首先被销毁。销毁的原则就是,最后创建的对象最先销毁。
Object number 3 being destroyed
Object number 2 being destroyed
Object number 1 being destroyed
这篇文章介绍了静态成员函数访问成员变量的若干问题,有些方法还是很精辟的
http://shellman.blog.sohu.com/98359969.html
其实我觉得还可以将静态函数定义为带参数的,讲需要用到的成员变量作为静态函数的参数传入静态函数就好了。
ps: 以下关于静态成员变量
初始化static成员变量不能安排在类的构造函数中,因为构造函数可能一再被调用,而变量的初值却只应该设定一次。也不要把初始化安排在头文件中,因为它可能会被包含在许多地方。而应该放在main函数之中,或全域函数中,或者任何函数之外。
初始化时候 [类型名] [类名]::[变量名] 例如:int Base::a ;
当静态成员变量被声明为private类型时,不能用类名::变量名 为静态成员变量赋值。
当声明为public 则可以.
另一个应该注意的地方:对静态函数的声明,只需在头文件中声明为static,不需要在cpp文件的函数前面再加static
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/28180.html