静态成员与静态成员函数
来源:互联网 发布: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.静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。
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
- 静态成员与静态函数
- 静态成员与静态函数
- 静态成员与静态成员函数
- 静态成员函数与静态数据成员
- 静态成员函数 与 静态数据成员
- 静态成员函数与静态数据成员
- 静态数据成员与静态成员函数
- 静态成员变量与静态成员函数
- 静态成员变量 与 静态成员函数
- 静态成员变量与静态成员函数
- c++静态成员与静态成员函数
- 静态成员与静态成员函数
- 静态成员变量与静态成员函数
- 成员函数与静态函数
- 继承与静态成员函数
- C++静态成员与函数
- 静态成员函数与非静态成员函数的区别
- 静态变量与静态成员函数
- C# FormHbitmap OutofMemoryException(内存溢出)解决方案
- Mahout学习之Mahout简介、安装、配置、入门程序测试
- C++字符串知识总结
- 在错误中成长——今目标反思
- 单例模式(线程安全考虑)
- 静态成员与静态成员函数
- 第三周项目4 顺序表应用(2)
- 基于Docker部署codis
- Android onTouchEvent和setOnTouchListener中onTouch的区别
- Java多线程中的竞争条件、锁以及同步的概念
- Linux下文件的复制、移动与删除
- 我的奋斗
- Codeforces Round #319 (Div. 2) C. Vasya and Petya's Game
- H.264 stream formats