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) 非静态成员函数可以访问静态成员函数或者调用静态成员函数;
- c++里面的静态成员和静态变量
- C++ 的静态成员和静态变量
- C/C++静态成员变量和静态成员函数
- c++:静态成员变量和静态成员函数使用问题
- 静态成员变量和非静态成员变量的对比
- Python的静态成员变量和非静态成员变量
- 静态成员变量和非静态成员变量的区别
- c++--静态成员变量
- 【C++】类的静态成员函数和静态成员变量的使用
- 成员变量和静态变量的区别?
- 成员变量和静态变量的区别?
- 成员变量和静态变量的区别:
- 静态变量和成员变量的区别
- 静态变量和成员变量的区别
- 静态变量和成员变量的区别
- 静态变量和成员变量的区别
- 成员变量和静态变量的区别
- 静态变量和成员变量的区别
- 内存缓存+磁盘缓存
- js防止刷新的倒计时代码
- 拖库 洗库 撞库
- Atitit 手机号码规范 数字化管理 靓号 吉祥号码 洋马儿 规范 attilax总结
- 多态
- c++里面的静态成员和静态变量
- 疯狂java笔记之常用的内部排序
- Java 并发之 CountDownLatch、CyclicBarrier 和 Semaphore
- 合唱团
- ZXing 真正谷歌原生二维码扫码DEMO,比网上的同类demo快十倍,含条形码识别
- Atitit uke证件编码规范与范本
- 暑假集训总结
- 浅谈JS对象的属性封装性
- 何为人?