静态成员与静态成员函数

来源:互联网 发布:mac上迅雷下载不了 编辑:程序博客网 时间:2024/06/05 20:39

静态成员:

有一些属性是类中所有对象共有的

如果放在全局变量中,则它们在类外面,既不安全,又影响了重用性

使用场合:

用来保存流动变化的对象个数

作为一个标志,指示一个特定的动作是否发生

一个指向一个链表第一个成员或最后一个成员的指针

#include<iostream>using namespace std;class Student{    private:int student_id;static int sum_student;     <span style="color:#ff0000;">//定义类的静态成员,学生统计</span>    public:Student(const int x):student_id(x){sum_student++;};  <span style="color:#ff0000;">//每添加一个学生,学生人数+1</span>~Student(){sum_student--;};                          <span style="color:#ff0000;">//每析构一个学生,学生人数-1 </span>static void show_count()<span style="white-space:pre"></span><span style="color:#ff0000;">//静态成员函数</span>{    cout<<sum_student<<endl;
<span style="white-space:pre"></span>    cout<<student_id<<endl;  <span style="color:#ff0000;"> //错误,静态函数不能对非静态成员进行访问</span>}};int Student::sum_student=0;     <span style="color:#ff0000;"> //静态成员在类外分配空间和初始化</span>int main(){    Student a(201501);    Student b(201502);    a.show_count();             <span style="color:#ff0000;">//查看静态成员 学生人数,显示为2;</span>
    Student.show_count(); <span style="white-space:pre"></span><span style="color:#ff0000;">//静态成员函数无需实例化,无需对象也可以访问</span>    return 0;}

定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。
特点:
A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。
C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束
数据成员可以分静态变量、非静态变量两种.
静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用"类名.静态成员名"访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员函数不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员函数可以直接访问类中静态的成员.
非静态成员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内存中..
一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数..
分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新
静态成员函数:
静态成员函数定义是类的内部实现,属于类定义的一部分,它的定义位置与一般成员函数一样
一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。
1.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下: 
class base{ 
static int func1(); 
int func2(); 
}; 

int (*pf1)()=&base::func1;//普通的函数指针 
int (base::*pf2)()=&base::func2;//成员函数指针 

2.静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。 

3.静态成员函数不可以同时声明为 virtual、const、volatile函数。举例如下: 
class base{ 
virtual static void func1();//错误 
static void func2() const;//错误 
static void func3() volatile;//错误 
}; 

3.静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。

0 0
原创粉丝点击