C++ 静态成员函数

成员函数也可以定义为静态的,在类中声明函数的前面加static就成了静态成员函数,例如:

    //定义静态成员函数;

    static long long get_number(){

        return number;

    }

       和静态成员变量一样,静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“::”,例如:

student::get_number();

静态成员变量和静态成员函数,是属于类。那么,当用类来定义一个对象之后,静态成员变量和静态成员函数也属于对象,所以,也允许通过对象名调用静态成员函数。如下是程序测试代码:

 

       程序运行结果如下:

 

       可以看到,student类定义了get_number ()静态成员函数,那么,可以通过对象stud访问,也可以直接通过类名student来访问。

       注意:当调用一个对象的成员函数(非静态成员函数)时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数并不属于某一个对象,它与任何对象都无关,因此静态成员函数没有this指针,既然它没有指向某一对象,就无法对一个对象中的非静态成员进行默认访问(即在引用成员变量时不指定对象名)。

       可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,而“静态成员函数没有this指针”,由此决定了静态成员函数不能访问本类中的非静态成员。

       静态成员函数可以直接引用本类中的静态成员变量,静态成员变量同样是属于类的,可以直接引用。在C++程序中,静态成员函数主要是用来访问静态成员变量,而不访问非静态成员。如下是一个例子,声明了volume(); 函数是 static 类型。那么,在该函数中只能够访问static类型的成员变量。

class Box

{

public:

    static int height;  // 定义为静态成员变量

    int width;

    int length;

    Box(int, int);

    static int volume();    //静态成员函数

};

int Box::volume()   //是static 类型的函数

{

    cout << height <<endl;  //合法,因为height 是static类型

    cout << width << endl;  //非法,因为width 不是static类型

}

       但是,并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找哪个对象。如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”,例如:

Box a(16, 11);  //定义一个对象a

int Box::volume()   //是static 类型的函数

{

    cout << a.width << endl;    //a 在这是定义的一个全局对象,在volume()函数中,可以访问指定的 a 对象的非静态成员变量。

    return 0;

}

只要 a  是一个已经定义的 Box 类对象,而且,它的作用域在 volume(); 内,那么,这个语句就合法。

6 总结

       学习了静态成员变量和静态成员函数,我们了解到static关键字修饰的成员变量和成员函数,就属于“静态”类型。就是属于当前类的属性。

       所以,当我们定义一个C++类的时候,静态成员就已经存在,它是属于这个类。所以,就可以直接通过类名来访问静态成员。

       当“编译程序”的时候,它们就存在的,所以编译程序完成之后,不用定义类对象,就可以访问类的静态成员变量和静态成员函数,程序测试如下:

 

       程序运行结果如下:

 

       可以看到,在main()函数中没有定义任何对象,直接通过student类名访问静态的print()函数,而且,在print()函数中访问静态的成员变量。

所以,对于静态成员变量和静态成员函数,它们是属于一个类的,那么编译程序的时候,就对类进行了编译处理,所以,编译完程序之后,就可以使用类名和作用域运算符“::”来调用。

       而对于非静态的成员变量和成员函数,是由一个对象来确定的,所以,必须在定义对象之后,才能够调用它们。

       静态成员变量和静态成员函数,都是属于类的,可以使用类名和作用域运算符“::”来调用它们。当定义了类对象之后,也可以如同普通的成员变量和成员函数一样,使用对象和点运算符“.”来调用它们。

       我们可以以“物体出现的时间先后顺序”来推理理解:静态和非静态成员之间的调用关系。根据,C++程序被编译之后,类先被编译出来,然后,才可以使用类来定义对象。所以,类先出现在对象之前。

假设现在只编译了类,不定义对象,所以,就通过类名来操作静态成员变量静态成员函数。如果此时,在静态成员函数中操作了非静态的成员变量,则出错,因为,非静态的成员变量是属于一个对象的,而此时,我们还没有使用类来定义对象,没有任何一个对象存在,所以,我们定义的静态成员函数,不能够调用非静态的成员变量和成员函数。

       如果使用类来定义了一个对象,那么,这个对象的非静态成员变量和成员函数就产生了。而且,在编译了类之后,类的静态成员变量和静态成员函数已经生成,所以,可以使用对象的非静态成员函数来操作静态的成员变量和静态的成员函数。

读者要仔细分析,掌握好每一个知识点,然后,自己总结出对该知识点的理解。自己总结出来的知识,理解才深刻,才是自己掌握的知识。

  • 26
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韦凯峰Linux编程学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值