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

来源:转载

c++l类中static成员函数和成员数据变量使用,有需要的朋友可以参考下。


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用以生成唯一的标志




分享给朋友:
您可能感兴趣的文章:
随机阅读: