您的位置:首页 > 其它

静态数据成员及静态成员函数

2013-08-14 22:25 344 查看
静态数据成员:

作用:实现同类的多个对象之间的数据共享,且又避免了使用全局变量实现数据共享的不安全性。

(1)以关键词static开头.

(2)为各对象所共有,对象分配的空间中不包含静态数据成员所占空间。

(3)静态数据成员在对象外单独开辟空间,其空间不随对象的建立和撤销的影响,静态数据成员在程序编译时被分配空间,到程序结束时才释放空间。

(4)静态数据成员可以初始化,但只能在类体外进行,一般形式:

数据类型类名::静态数据成员名  =  初值  ;(不能初始化表进行初始化)

(5)静态数据成员两种引用方法1、通过对象名引用2、通过类名引用

举例讲解:

class Box
{
public:
static int i;
};
int main()
{
Box box1;
cout<<Box::i<<endl;
}

结果提示出错,原因在于静态数据成员被使用前需要在类外进行定义性说明(定义性说明也可同时对其初始化),即增加:  int Box::i;  或者  int Box::i=初值;

class Box
{
public:
static int i;
};

int main()
{
Box box1;

int Box::i;

cout<<Box::i<<endl;
}

但是增加:   int Box::i;  或者  int Box::i=初值;后结果仍是出错,一番折腾后发现,静态数据成员为独立空间不在对象分配的空间中,它的空间需要在程序一开始就被分配,但函数是程序运行中被调用的,所以静态数据不能在函数中进行定义性说明或初始化。

class Box
{
public:
static int i;
};

int Box::i;

int main()
{
Box box1;
cout<<Box::i<<endl;
cout<<box1.i<<endl;
}

至此,程序终于运行成功。

这里还特意示范了两种静态数据成员引用方式

cout<<Box::i<<endl;
cout<<box1.i<<endl;

运行结果为:

 
   这里说明了未对静态成员赋初值,编译系统默认初值为0

class Box
{
public:
static int i;
Box(int a):i(a){}
};

编译不通过,原因是不能采用参数初始化表对静态数据成员进行初始化。

#include<iostream>
using namespace std;
class Box
{
public:
static int i;
Box(int a)
{
i=a;
}
};
int Box::i;
int main()
{
Box box1(10);
cout<<Box::i<<endl;
cout<<box1.i<<endl;
}

但这种方法进行初始化成功。

静态成员函数:

主要作用:为了能处理静态数据成员。

(1)与非静态成员函数区别在于,静态成员函数没有this指针,决定了不适合访问本类中的非静态成员,

但若一定要引用本类中的非静态成员,应当加对象名和成员运算符“.”。

(2)静态成员函数也如同静态数据成员一样有两种调用方法1、通过对象名调用2、通过类名调用

举例讲解:
class Box
{
public:
static int i;
static int handle()
{
i=10;
return i;
}
};
int Box::i;
int main()
{
Box box1;
cout<<Box::handle()<<endl;
cout<<box1.handle()<<endl;
}

编译通过,这里特意示范了两种静态成员函数调用方式

cout<<Box::handle()<<endl;
cout<<box1.handle()<<endl;

这里我们尝试访问用静态成员函数本类中的非静态成员:

class Box
{
public:
int i;
static int handle()
{
box1.i=10;
return box1.i;
}
};
int main()
{
Box box1;
cout<<Box::handle()<<endl;
cout<<box1.handle()<<endl;
}

编译出错,提示box1没有定义,仔细一想,原因在于box1在main函数中定义的,是局部变量,

它的作用域只限于main函数,所以static int handle()函数中无法使用box1。应该将box1的定义放在函数外。

class Box
{
public:
int i;
static int handle();
};
Box box1;
int Box::handle()
{
box1.i=10;
return box1.i;
}
int main()
{
cout<<Box::handle()<<endl;
cout<<box1.handle()<<endl;
}
程序运行成功。
特别注意一点,box1的定义放在函数外且要求:要先定义类Box,然后再定义对象Box
box1;,定义对象后才能再定义函数static int handle();。所以只能写出如下方式:
class Box
{
public:
int i;
static int handle();
};
Box box1;
int Box::handle()
{
box1.i=10;
return box1.i;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: