c++里面的静态成员和静态变量

来源:互联网 发布:软件需求说明书包括 编辑:程序博客网 时间:2024/05/19 06:37

C++ 里面的静态成员和静态成员函数

1.记录对象产生的个数

C里面使用全局变量

2.c语言里面适用全局变量的缺点:

(1)将来如果需要记录其他类产生的对象,需要多个全局变量,全局变量会和一个类硬生生的产生关系;

(2) 违背了低耦合的编程思想

3静态成员变量初始化位置

  (1)类实现文件.cpp文件

  (2)main()函数实现之前

  (3)不能在函数内部进行初始化

    (4) 不能放在构造函数内部进行初始化

 (5)无论静态变量成员是private还是public,初始化还是要放在类的实现文件或者是main()函数之前


为什么初始化不能放在初始化列表中,因为静态变量只能有一个,如果放在初始化列表,每次创建对象,都会有一个静态变量产生;

下面这个例子实现了对学生类的增删改查,其中用到双链表的数据结构;

删除函数和打印函数应该是每个成员共享的,而不依赖于每一个对象,如果声明为普通成员函数,那么每次调用函数,都需要构造对象,然而打印和删除并不是具体针对某一对象;所以删除和打印应该使用静态成员函数;

//double link for explan static arguments#include <iostream>#include <stdlib.h>#include <string.h>using namespace std;class DNode      //节点类{           public:struct Student{               //数据域int num;char name[20];float score;}m_data;       //变量名static DNode *s_head;static DNode *s_tail;DNode *m_next;//指针域DNode *m_pre;public:DNode();//:s_head(NULL),s_tail(NULL)DNode(int num,const char *name,float score);//:s_head(NULL),s_tail(NULL) //有参构造函数声明 void headInsert();   //头插法声明 void tailInsert();   //头插法声明 static void headDelete();//头删法实现 static void tailDelete();//尾删法实现 static void printDlist();//打印节点声明~DNode();};//类的声明到此结束DNode * DNode::s_head=NULL;DNode * DNode::s_tail=NULL;//DNode * DNode::s_head =NULL;//DNode * DNode::s_tail =NULL;DNode::DNode()//无参构造函数{//构造函数能直接类里面的数据cout<<"num:";cin>>m_data.num;cout<<"name:";cin>>m_data.name;cout<<"score";cin>>m_data.score;}DNode::DNode(int num,const char *name,float score){ //有参构造m_data.num=num;strcpy(m_data.name,name);m_data.score=score;}DNode::~DNode()//析构函数实现{//判断要脱的是否是第一个节点if(s_head==this){  s_head=s_head->m_next;  if(s_head==NULL)   {//来到是要拖的最后一个节点   s_tail=NULL;   }   else   {          s_head->m_pre=NULL;//有确保安全性         }}else {     this->m_pre->m_next=this->m_next; if(this == s_tail) {//要删除的节点视尾节点 s_tail=this->m_pre; } else  {this->m_next->m_pre=this->m_pre;  }     } //最后一个节点}void DNode::headInsert(){if(s_head==NULL){s_head=s_tail=this;this->m_next=NULL;        }else{this->m_next=s_head;s_head->m_pre=this;s_head=this;}}void DNode::tailInsert(){   if(s_head==NULL){   s_head=s_tail=this;   this->m_next=NULL;    }else{    this->m_pre=s_tail;this->m_next=NULL;s_tail->m_next=this;s_tail=this;}}void DNode::headDelete(){if(s_head==NULL){return ;}delete s_head;}void DNode::tailDelete(){if(s_head==NULL){    return ;}delete s_tail;}void DNode::printDlist(){DNode *temp=s_head;for(;temp;temp=temp->m_next){cout<<"[num="<<temp->m_data.num<<",name="<<temp->m_data.name<<",score="<<temp->m_data.score<<"}-->";}cout<<"NULL\n";}int main(int argc,char *argv[]){int select;DNode *d;while(1){cout<<"========"<<endl;cout<<"1.头增"<<endl;cout<<"2.尾增"<<endl;cout<<"3.头删"<<endl;cout<<"4.尾删"<<endl;cout<<"5.打印数据"<<endl;cout<<"0.退出"<<endl;cin>>select;    switch(select){case 1:d=new DNode;d->headInsert();    break;case 2:d=new DNode;d->tailInsert();break;    case 3:DNode::headDelete();break;case 4:DNode::tailDelete();break;case 5:    DNode::printDlist();break;case 0:exit(0);    break;    }cout<<" "<<endl;}return 0;}

静态成员函数初始化:

(1)初始化在类体外进行,而且前面不能加static;

(2)初始化时不加改成元的访问权限控制符private;

(3)初始化时使用作用域运算符来标明它所属的类,因此,静态数据成员是类的成员,而不是对象的成员

静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化

静态数据成员初始化的格式如下:

<数据类型> <类名>::<静态数据成员名> = <值>

DNode * DNode::s_head       = NULL


4.静态成员的访问

  (1)静态成员变量不属于任何对象,所以不依赖于任何对象访问

  (2)所有对象共享静态成员变量

    (3)    无论是对象或者类去访问某个静态变量成员,public属性的静态访问访问如下

  Student::count;

  Student s1;

  s1.count

  private属性的静态成员函数变量,需要依赖于public公共的接口,不能直接访问;

5.静态成员函数

一般对私有的静态成员变量进行操作

6.静态成员函数的注意点

  (1)静态成员函数不能访问非静态数据成员,不能调用非静态成员函数,因为静态成员不依赖于对象, 所以无法传入this指针

  (2) 非静态成员函数可以访问静态成员函数或者调用静态成员函数;