C++静态数据成员和静态成员函数~

来源:互联网 发布:淘宝店铺关注怎么刷 编辑:程序博客网 时间:2024/06/08 08:42

①静态数据成员

1.为什么我们需要使用静态数据成员?

  我们知道每一个对象都有自己独有的数据成员的值,那怎么去实现不同对象之间可以去共享数据呢?于是就有了两种的方法:一个是全局变量,但是由于全局变量也可以被成员函数调用进而修改它,所以这样很不安全,故这种方法不可行;第二种就是静态数据成员了,可以实现数据共享,该类的所有对象都共享这块静态存储空间。

  定义静态数据成员,它不专属于某一个对象,它的生命周期与整个程序的生命周期相同,因此即使某个对象消亡了,静态数据成员还是存在的,值没有改变。


2.声明静态数据成员的格式:

static 数据类型 成员名;

(同样受访问控制符的作用)


3.静态数据成员只能在类外初始化,不能再构造函数中初始化,原因有二:

First:静态数据成员不专属于某一个对象,而是所有对象共享的,所以如果在构造函数中初始化,就会使每定义一个对象的时候都会初始化一遍静态数据成员,显然与我们的目的有冲突。

Second:静态存储区应在程序运行之前分配,而如果在构造函数中定义的话,就只能在创建对象的时候才会调用到构造函数,去初始化静态数据成员,所以我们应该把它定义在类外,目的就是为了在程序运行前对其进行分配空间。


4.静态数据成员可以用类名去访问,当然的毫无疑问的也可以用对象名去访问。


5.普通的成员函数也可以访问静态数据成员。  //但是静态成员函数不能直接访问普通数据成员


②静态成员函数

1.为什么我们需要使用静态成员函数?

为了能够更加方便的访问静态数据成员,C++定义了一种特殊的成员函数来专门负责对静态数据成员的存取。

同样静态成员函数也不是专属于哪一个对象的,是每个对象都共享的。

2.声明静态成员函数的格式:

static 返回值类型  函数名(参数表);


3.静态成员函数与普通成员函数的区别:

First:静态成员函数没有this指针,因为它不是某一个对象私有的,而是所有对象共享的,是专门用来处理静态数据成员的,所以在访问数据成员的时候不需要告诉系统这个访问的数据成员究竟是属于哪一个对象的,故在静态成员函数中是没有this指针的。

——》这个也就导致了一个问题,静态成员函数不能直接去访问非静态数据成员,因为没有this指针,没有办法去告诉编译器这个数据成员究竟是哪一个对象的。

但是,我们可以通过参数的方式间接去调用非静态的数据成员

eg.  static int GetDate(Date someday)

        {     

                     return someday.day+comday;  //假设comday是定义的静态数据成员

         }

从这个代码中可以看到提供一个对象作为参数就可以访问非静态数据成员了,因为这时候通过“.”作用域限制符就可以告诉编译器这个数据成员是哪一个对象的


Second:静态成员函数可以通过类名去访问,当然也可以通过对象名去访问;但是普通成员函数只能通过类名去访问。


4.静态成员函数可以通过类名去访问,当然也可以通过对象名去访问


--------------------------------------------------------------------------------------------------------------------------------------------

#includeusing namespace std;#includeclass Cpoint{public:Cpoint(int x, int y);~Cpoint(void);void Print(void);static int Getcounter(void);static int counter;private:int x, y;};int Cpoint::counter = 0;Cpoint::Cpoint(int x, int y){this->x = x;this->y = y;}Cpoint::~Cpoint(void){counter--;}void Cpoint::Print(void){cout << "x=" << x << "," << "y=" << y << "counter="<

   

0 0
原创粉丝点击