static成员与const方法(十五)

来源:互联网 发布:淘宝我的五星好评截图 编辑:程序博客网 时间:2024/06/05 07:28

1、static修饰类的成员包括成员数据和成员函数

       static修饰成员数据,则该成员数据属于类而不属于某个对象,所以具有一下性质:

               (1)初始化时不能在构造函数中初始化,只能在类外部以Test::data=0的形式初始化,因为它不属于对象,而构造函数是创建对象才会调用的函数;

               (2)静态成员数据属于类,所以成员函数可以使用静态成员数据,如构造函数中的count++,析构函数中的count--等

               (3)在访问该静态成员数据时可以通过类作用域访问,如Test::data,也可以通过任一对象访问,如t.data,因为每个对象都保存了对静态成员数据索引。

       static修饰成员函数,则该成员函数具备两个属性,一是可以访问类中的私有成员(只限于静态成员);二是static成员函数属于类的作用域。所以,static成员函数有以下性质:

              (1)static成员函数的调用不是通过对象激活的而是通过类来激活,因为该函数不会转换为含有this指针函数;

              (2)static成员函数只能调用static静态成员数据而不能调用普通成员数据,因为它没有this指针,而普通的成员函数即可以调用普通成员数据也可以调用static成员数据。

        对于普通成员函数即可以访问普通成员数据,也可以访问静态成员数据。

        普通成员方法能够调用静态成员方法,而静态成员方法不能调用普通成员方法,只能调用静态成员方法。

实例如下:

#include <iostream>
class Test{
public:
  Test(int d=0):data(d){
    count++;
  }
  ~Test(){
    count--;
  }
  void show(){
    std::cout<<data<<std::endl;
    std::cout<<count<<std::endl;
  }
  static void static_show(){
    //std::cout<<data<<std::endl;
    std::cout<<count<<std::endl;
  }
private:
  int data;
  static int count;
};
//initialization
int Test::count = 0;


#include <iostream>
#include "static_const.h"
int main(int argc, char **argv){
  Test t1;
  Test t2(100);
  t1.show();
  Test::static_show();
  return 0;
}

二、const应用


public:
  void list(){
    std::cout<<"this is list()"<<std::endl;
  }
  void list()const{
    std::cout<<"this is list()const"<<std::endl;
  }


在类中添加了一个普通方法,添加了一个常方法。一个函数的const既可以修饰参数,也可以修饰函数,还可以修饰返回值。对于修饰参数是保护参数参数在函数中不被修改。对于修饰函数称为常方法,它修饰的*this,即该方法不能改变整个类的数据成员。即const  Test * const this。普通方法有一个const只封锁了this不变,而常方法还修饰了*this为常量,所以不能修改成员数据。


原则:方法如果不改变数据,尽可能定义为常方法,否则不能定义。  一般方法能够调用常方法,而常方法不能调用一般方法。






原创粉丝点击