类中的静态成员(static)

(一)静态数据成员

      静态数据成员是类的所有对象共享的成员,而不是某个对象的成员。

      使用静态数据成员可以节省内存,静态数据成员只存储一处,供所有对象使用。静态数据成员相当于类中的“全局变量”(一个对象改变了它的值,例如改变的值为a,那么其他对象看到它的值为都为a)。

 使用静态成员的方法和注意事项:

1、 静态数据成员在定义或说明是前面加上关键字“static

eg: private:

          int  a;

          static int staticVariable;//定义了一个静态变量

2、静态成员的初始化

(1)初始化在类体外进行,前面不加static,以免与一般静态变量或对象相混淆。

(2)初始化时使用作用于运算符::来标明他所属的类(这也说明了静态数据成员是属于类的,而不是属于某个对象的。)

eg:    class A {

         private:

              int a ;

         public:

               static int staticVariable;

        };

        int A::staticVariable = 0; //在类外进行初始化,并加上作用于运算符(::)

注意:静态数据成员存放在静态存储区,必须对它进行初始化。

3、引用静态成员的格式

       如果静态成员的访问权限是public,则可以用

        <类名> ::<静态成员名>的格式来访问

       eg:A ::staticVariable = 10;

 举一个例子:

class Number{

    private:

          int a,b;

          static int staticVarible;

    public:

           void getVariable(){

                 cout << a << "," << b <<"," << staticVarible << endl;

             }  

           void getStaticVarible(){

                  cout << staticVarible << endl;

             }

           Number (int a , int b , int c){

                  this->a = a;//当参数的名字与类中变量名相同时,用this指针加以区分

                  this->b = b;

                  this->staticVarible = c;

            }

 };

 int Number :: staticVarible = 3;// 类外初始化静态数据成员


void main(){

 

    Number M(3,7,1);

    M.getVariable();

   

    Number N(10,8,11);

    N.getVariable();

   

    M.getStaticVarible();

    N.getStaticVarible(); 

}

输出结果:

3,7,1

10,8,11

11

11

 结果表明了在初始化了N以后,M中的StaticVarible的值变成了11,说明了静态数据成员是多个对象共享的。


(二)静态成员函数:

      静态成员函数与静态成员一样,都属于类,而不属于某个对象。因此,对静态成员的引用可以用类名

 注意:静态成员函数的实现中可以直接引用类中说明的静态成员,不可以直接引用类中说明的非静态成员(为什么不能引用呢?因为非静态成员只能通过对象来调用,而不能通过类来调用,意味着在没有对象存在时,非静态成员是不分配内存的,如果静态成员函数用了非静态成员那么将产生错误)。静态成员函数如果要引用非静态成员时,可以通过对象来访问。

举一个例子:

class Number{ 

private:

    int a,b;

    static int staticVarible;  

public:

       Number (int a , int b , int c){ 

        this->a = a;

        this->b = b;

        this->staticVarible = c;   

    }

    int getStaticVarible(){   

        return staticVarible;

    }

   

    //静态成员函数可以在类内定义也可以在类外定义

    static void printStaticVarible(){

        cout << staticVarible; 

    };

    static void printVaribles(Number f);

 };

 

int Number :: staticVarible = 3;


void Number::printVaribles(Number f){

/*----这里用 f 可以调用类中的私有成员,是因为 printVaribles(Number f) 是类函数的缘故----*/

    f.printA();//只能用对象来访问非静态成员函数

    cout << "b = " << f.b << endl;//只能用对象类访问非静态数据成员

    cout << "staticVarible = " << staticVarible << endl ;//可以直接访问静态数据成员

   printStaticVarible();//可以直接访问静态成员函数



}

void main(){ 

    Number M(3,7,1);

    Number N(10,8,11);

   

/*------------两种方式调用静态成员函数-----------------*/

    M.printVaribles(M);//通过对象调用

    Number::printVaribles(N);//通过类名来调用

}


输出结果:

a = 3

b = 7

staticVarible = 11

静态成员函数 staticVarible = 11

a = 10

b = 8

staticVarible = 11

静态成员函数 staticVarible = 11

转载于:https://my.oschina.net/u/1245365/blog/178325

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值