c++中的static关键字-----静态成员函数和静态成员变量

什么是静态成员函数和静态成员变量??(有些地方也叫作静态函数成员和静态数据成员)

  当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。

  静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。

 

静态成员变量的用途:

          静态成员变量的用途之一是统计有多少个对象实际存在。

 

静态成员变量的初始化:

  • 静态成员变量不能在类中初始化。因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。
  • 静态成员变量的值对所有的对象是一样的。静态成员变量可以被初始化,只能在类体外进行初始化。 
    初始化的一般形式:
    数据类型类名::静态数据成员名=初值
 
静态成员函数没有this指针!!!
  静态成员函数没有this指针,是类的所有对象共有一份而已;
  非静态成员函数有this指针,每个对象都有自己的独立的this指针。
  
静态成员函数的使用
 
student.h
#pragma once

#include "iostream"
using namespace std;

class Student
{
public:
    Student();
    ~Student();

    static int num;
    static int GetNum()
    {
        num += 15;;
        return num;
    }
    static int GetAge()
    {
        //age++;//error C2597: 对非静态成员“Student::age”的非法引用
        //cout << age << endl;//error C2597: 对非静态成员“Student::age”的非法引用
        //return age;//error C2597: 对非静态成员“Student::age”的非法引用
        return 0;
    }
    static int GetAge(const Student& stu)//静态函数成员必须通过对象名来访问非静态数据成员
    {
        //cout << age << endl;//error C2597: 对非静态成员“Student::age”的非法引用
        cout << stu.age << endl;
        return stu.age;
    }
private:
    int age;

};

  

mainwin.cpp

#include "iostream"
using namespace std;

#include"student.h"

int Student::num = 10;

void main()
{
    Student stu;
    stu.age = 19;

    stu.GetAge(stu);//输出19
    cout << Student::num << endl;//10
    Student::num = 20;
    cout << Student::num << endl;//20
    cout << Student::GetNum() << endl;//35
    cout << stu.GetNum() << endl;//50
    system("pause");
}

 

 通过上例可知:
  • 静态函数成员必须通过对象名来访问非静态数据成员
另外,静态成员函数在类外实现时候无须加static关键字,否则是错误的。
    若在类的体外来实现上述的那个静态成员函数,不能加static关键字,这样写就可以了:
     int test::Getnum()
     {
       .........
     }
 
 
注意事项:
  • 不能用参数初始化表对静态成员初始化。一般系统缺省初始为0。static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。
  • 静态成员函数在类外实现时候无须加static关键字,否则是错误的。
  •  静态函数成员必须通过对象名来访问非静态数据成员。(因为静态函数没有this指针
  • 静态成员不能在类定义里边初始化,只能在class body外初始化。
  • 静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。
  • 非静态成员函数可以任意地访问静态成员函数和静态数据成员。
拓展: 

静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数

由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长

 

调用静态成员函数:
方法一:可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数。
方法二:类名::静态成员函数
 
 

 

posted @ 2016-11-02 10:28  ren_zhg1992  阅读(258)  评论(0)    收藏  举报