您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-06 00:58 176 查看

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) 非静态成员函数可以访问静态成员函数或者调用静态成员函数;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息