您的位置:首页 > 编程语言 > C语言/C++

c++l类中static成员函数和成员数据变量使用

2015-11-03 12:08 363 查看
c++中为了保护类的封装性,提出了static成员来代替全局变量,下面我们来了解一下static成员的使用方法:程序通过vs2008调试成功

例一:

#include "stdafx.h"

#include<iostream>

#include<string>

#include<cassert>

#include<malloc.h>

#include<fstream>

class test

{

public:

static void show(void);//static成员函数只能访问static数据成员,不能访问普通的数据成员

private:

static int a;//static数据成员可以类内所有成员函数访问

int b;

};

int test::a = 15;//类static数据成员必须在类声明处外初始化

void test::show (void){std::cout<<test::a<<std::endl;}//类static成员函数必须在类外面定义,在类结构内只能声明

int main(void )

{

test test_1;

test_1.show();//访问类static成员和普通成员一样,但是要注意static成员不能用this指针访问

system("pause");

return 0;

}

例二:记录有多少个test对象被创建

#include "stdafx.h"

#include<iostream>

#include<string>

#include<cassert>

#include<malloc.h>

#include<fstream>

class test

{

public:

test(){a=a+1;}

~test(){}

static void show(void);

private:

static int a;

int b;

};

//void test::initial(int& lhs){test::a = lhs;}

int test::a = 0;

void test::show (void){std::cout<<test::a<<std::endl;}

int main(void )

{

test test_1;//创建一个对象

test_1.show();//输出a=1

test test_2;//创建第二个对象

test_2.show();//输出a=2

system("pause");

return 0;

}

3.静态局部变量属于静态存储方式(即不在栈内),它具有以下特点:
(1)生存期长:
静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)作用域:
静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同。
(3)比全局变量副作用小:
离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值,虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,例如中途被其它函数修改。
(4)一个静态数据成员不能是联合成员,也不能是位域成员。
(5)静态成员函数不能声明为const!但参数可以是const。
4.注意事项:
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。
(3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊,变量地址是指向其数据类型的指针,函数地址类型是一个“nonmember函数指针”。
(4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就产生了一个意想不到的好处:
成为一个callback函数,使得我们得以将C++和C-based
X Window系统结合,同时也成功的应用于线程函数身上。
(5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问时间,节省了子类的内存空间。
(6)静态数据成员在<定义或说明>时前面加关键字static。
(7)静态数据成员是静态存储的,所以必须对它进行初始化。
(8)静态成员初始化与一般数据成员初始化不同:
初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private,public等;
初始化时使用作用域运算符来标明它所属类;
所以我们得出静态数据成员初始化的格式:
<数据类型><类名>::<静态数据成员名>=<值>
(9)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。
这里有一点需要注意:我们说静态成员为父类和子类共享,但我们又重复定义了静态成员,这会不会引起错误呢?
不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: