static数据成员、static成员函数
static数据成员的引入:
不同对象之间共享访问,本质上是对该类型所有对象,只维持一份拷贝
与全局变量相比,优势:
1. 静态数据成员仍然是在类域名字空间,没用进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能
2. 可以实现信息隐藏,静态数据成员可以是private成员,全局变量不行
注意:
1. 静态数据成员必须在类定义外初始化,但const静态数据成员除外,const静态数据成员可以在类体中初始化
一般情况下:
2. 类成员函数(无论是static成员函数或非static成员函数)都可以直接访问static数据成员
3. 访问方式有两种: object.static_var 或 classname::static_var
特殊性:
1. static数据成员的类型可以是其所属类,而非static数据成员类型只允许为该类的指针或引用
example:
2. 静态数据成员可以作为类成员函数的缺省参数,而非static成员不能。
分析:静态成员函数如果未初始化,系统自动会给它初始化为某个缺省值(如int初始化为0, 指针初始化为NULL等)。 所以一旦定义,其值已确定,可以作为类成员函数的缺省参数
static成员函数的引入:
如果某成员函数只访问static数据成员,而不访问任何其他的数据成员(非static),那么此成员函数就与哪个对象来调用无关。
1. 只在类体的函数声明前加static, 类体外函数定义不能指定关键字static
2. 静态成员函数没有this指针
3. 访问方式也有两种
不同对象之间共享访问,本质上是对该类型所有对象,只维持一份拷贝
与全局变量相比,优势:
1. 静态数据成员仍然是在类域名字空间,没用进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能
2. 可以实现信息隐藏,静态数据成员可以是private成员,全局变量不行
注意:
1. 静态数据成员必须在类定义外初始化,但const静态数据成员除外,const静态数据成员可以在类体中初始化
一般情况下:
1 //类体c1.h
2 class c1
3 {
4 public:
5
6 private:
7 static int num;
8 static const string name = "chio";
9 };
2 class c1
3 {
4 public:
5
6 private:
7 static int num;
8 static const string name = "chio";
9 };
1 //类实现c1.cpp
2 #include "c1.h"
3
4 int c1::num = 20;
const string name ; //仍然需要在类体外定义
5 void c1::..
6
2 #include "c1.h"
3
4 int c1::num = 20;
const string name ; //仍然需要在类体外定义
5 void c1::..
6
2. 类成员函数(无论是static成员函数或非static成员函数)都可以直接访问static数据成员
3. 访问方式有两种: object.static_var 或 classname::static_var
特殊性:
1. static数据成员的类型可以是其所属类,而非static数据成员类型只允许为该类的指针或引用
example:
1 class Bar
2 {
3 public
4 //
5 private:
6 static Bar mem1;//ok
7 Bar *mem2;//ok
8 Bar mem3; //error
9 };
2 {
3 public
4 //
5 private:
6 static Bar mem1;//ok
7 Bar *mem2;//ok
8 Bar mem3; //error
9 };
2. 静态数据成员可以作为类成员函数的缺省参数,而非static成员不能。
分析:静态成员函数如果未初始化,系统自动会给它初始化为某个缺省值(如int初始化为0, 指针初始化为NULL等)。 所以一旦定义,其值已确定,可以作为类成员函数的缺省参数
static成员函数的引入:
如果某成员函数只访问static数据成员,而不访问任何其他的数据成员(非static),那么此成员函数就与哪个对象来调用无关。
1. 只在类体的函数声明前加static, 类体外函数定义不能指定关键字static
2. 静态成员函数没有this指针
3. 访问方式也有两种