静态数据成员及静态成员函数
2013-08-14 22:25
344 查看
静态数据成员:
作用:实现同类的多个对象之间的数据共享,且又避免了使用全局变量实现数据共享的不安全性。
(1)以关键词static开头.
(2)为各对象所共有,对象分配的空间中不包含静态数据成员所占空间。
(3)静态数据成员在对象外单独开辟空间,其空间不随对象的建立和撤销的影响,静态数据成员在程序编译时被分配空间,到程序结束时才释放空间。
(4)静态数据成员可以初始化,但只能在类体外进行,一般形式:
数据类型类名::静态数据成员名 = 初值 ;(不能初始化表进行初始化)
(5)静态数据成员两种引用方法1、通过对象名引用2、通过类名引用
举例讲解:
结果提示出错,原因在于静态数据成员被使用前需要在类外进行定义性说明(定义性说明也可同时对其初始化),即增加: int Box::i; 或者 int Box::i=初值;
但是增加: int Box::i; 或者 int Box::i=初值;后结果仍是出错,一番折腾后发现,静态数据成员为独立空间不在对象分配的空间中,它的空间需要在程序一开始就被分配,但函数是程序运行中被调用的,所以静态数据不能在函数中进行定义性说明或初始化。
至此,程序终于运行成功。
这里还特意示范了两种静态数据成员引用方式
运行结果为:
这里说明了未对静态成员赋初值,编译系统默认初值为0
编译不通过,原因是不能采用参数初始化表对静态数据成员进行初始化。
但这种方法进行初始化成功。
静态成员函数:
主要作用:为了能处理静态数据成员。
(1)与非静态成员函数区别在于,静态成员函数没有this指针,决定了不适合访问本类中的非静态成员,
但若一定要引用本类中的非静态成员,应当加对象名和成员运算符“.”。
(2)静态成员函数也如同静态数据成员一样有两种调用方法1、通过对象名调用2、通过类名调用
举例讲解:
编译通过,这里特意示范了两种静态成员函数调用方式
这里我们尝试访问用静态成员函数本类中的非静态成员:
编译出错,提示box1没有定义,仔细一想,原因在于box1在main函数中定义的,是局部变量,
它的作用域只限于main函数,所以static int handle()函数中无法使用box1。应该将box1的定义放在函数外。
特别注意一点,box1的定义放在函数外且要求:要先定义类Box,然后再定义对象Box
box1;,定义对象后才能再定义函数static int handle();。所以只能写出如下方式:
作用:实现同类的多个对象之间的数据共享,且又避免了使用全局变量实现数据共享的不安全性。
(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; }
相关文章推荐
- 3-6 静态数据成员与静态成员函数
- 静态数据成员和静态成员函数
- C++类静态数据成员与类静态成员函数
- 3-6 静态数据成员与静态成员函数
- 静态成员数据和静态成员函数
- 类的静态(数据)成员(函数)
- static 静态数据成员 静态成员函数
- C++中静态数据成员以及静态成员函数
- C++ 静态数据成员 静态成员函数
- 静态数据成员和静态成员函数在类中的应用举例
- 第七周任务一:求时分秒(含有静态数据成员和成员函数的Time类:类中所有的对象共有的数据)
- 静态数据成员和静态成员函数
- 类的静态数据成员和静态成员函数浅析
- 3-6 静态数据成员与静态成员函数
- 静态成员函数 间接 访问非静态数据成员
- C++静态成员数据与静态成员函数小结
- 静态数据成员和静态成员函数
- C++学习模板篇(静态数据成员与静态成员函数)
- 商店销售统计,每天有一个折扣价格,一次购10件以上者可以享受9.8折优惠,已知三个销售员的销售情况,运用静态数据成员和静态成员函数编写程序
- C++静态成员函数&静态数据成员