C++中的静态函数

一些有关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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值