静态数据成员(C++)

目录

一、静态数据成员

1.1、定义

1.2、声明

1.3、初始化

1.4、普通访问

1.5、对象访问

二、静态成员函数


一、静态数据成员

1.1、定义

我们都知道,类是对具有相同属性和相同行为的一组对象的描述。

有时侯,我们希望每定义一个对象,调用一次构造函数,其中有一些数据成员被所有对象共享,但是我们知道,类中的数据成员是每个对象所私有的,那么我们该如何使用一个数据让所有对象共享它呢?一个办法是将其定义为全局变量,这样就可以达到让多个数据对象共享的目的,但是全局变量的引入会带来不安全性,并且破坏了面向对象程序设计的信息隐蔽技术,与面向对象的封装性特点是矛盾的。为了实现同一个类中多个对象之间的数据共享,C++提出了静态数据成员的概念。

1.2、声明

在一个类中,若将一个数据成员说明为static,这种成员成为静态数据成员。与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据成员的拷贝,从而实现了一个类的不同对象之间的数据共享。

定义静态数据成员的格式如下:(我们以classA为例,以下都是)

static 数据类型 数据成员名;

static int x;

1.3、初始化

注意:静态数据成员的初始化与普通数据成员的初始化不同,静态数据成员的初始化应在类外单独进行,并且应在定义对象之前进行。一般在主函数main之前。类声明之后的特殊地带为它提供定义和初始化,初始化格式如下:

数据类型 类名::静态数据成员名=初始化值;注意这里不要加static关键字。

int classA::x=0;

1.4、普通访问

静态数据成员属于类,(准确的说是属于类对象的集合)而不像某一个数据成员那样属于一个对象,因此可以使用"类名::",访问静态数据成员,用类名访问静态数据成员的格式如下:

类名::静态数据成员名

cout<<classA::x<<endl;

1.5、对象访问

静态数据成员与静态变量一样,是在编译时创建并初始化,它在该类的任何对象创建前就存在。因此共有的静态数据成员可以在对象创建之前被访问,对象定义后,公有的静态数据成员,也可以通过对象进行访问,访问格式如下:

对象名.静态数据成员名;

对象指针->静态数据成员名;

classA A;
A.x;
A->x;

注意:私有的静态数据成员不能在类外直接访问,必须通过公有的成员函数访问。

class A {
private:
    int x;
    int y;
    int h;
    static int z;
public:
    A(int a,int b);
    ~A();
    void show1();
    void show2();
    static void  print();
};
A::A(int a,int b) {
    x = a;
    y = b;
    h = a + b;
    ++z;
}
A::~A() {}
void A::show1() {
    cout <<"x = "<< x << endl;
    cout <<"y = "<< y << endl;
    cout << "h= " << h << endl;
}
void A::show2() {
    cout << "次数为 "<<z << endl;
    //cout << "次数为  " << A::z << endl;//两种访问方式都可以
}
int A::z = 0;
int main() {
    A a(2, 2);
    a.show1();
    a.show2();
    A b(2, 3);
    A* p;
    p = &b;
    p->show1();
    (*p).show2();
    b.show1();
    b.show2();
    return 0;
}

测试用例:

 

二、静态成员函数

在类的定义中,前面有static说明的成员函数称为静态成员函数。静态成员函数属于整个类,是该类所有对象共享的成员函数,而不是属于类中的某个对象。定义静态成员函数的格式如下:

static   返回值类型   静态成员函数名(参数表);

与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:

类名::静态成员函数名(参数表);

对象.静态成员函数名(参数表);

对象->静态成员函数名(参数表);

例:

static  int  fun(int a,int b);


classA::fun(int a,int b);


classA A;
A.fun(int a,int b);
A->fun(int a,int b);

静态数据成员函数与非静态成员函数的重要区别是:非静态成员函数有this指针,而静态成员函数没有this指针。静态成员函数可以直接访问本类的静态数据成员,因为静态数据成员同样是属于类,可以直接访问。一般而言,静态成员函数不能访问类中的非静态数据成员,若确实需要访问非静态数据成员,静态成员函数只能通过对象名(对象指针或对象引用)访问该对象的非静态数据成员。例如:

class A {
private:
	int x;
	static int y;
public:
	A(int a);
	~A();
	void print();
	static void fun(A& a);
	static void fun1(A* p);
	static void show();
};
A::A(int a) {
	x = a;
	y++;
}
A::~A(){}
void A::print() {//普通成员函数调普通数据成员与静态数据成员
	cout << "x= " <<x<< endl;
	cout << "y= " <<y<< endl;
}
void A::fun(A& a) {//静态成员函数调普通数据成员
	cout << "x1= " << a.x << endl;
}
void A::fun1(A* p) {//这里指针方式就演示这一个哈
	cout << "x2= " << p->x<< endl;
}
void A::show() {//静态成员函数调静态数据成员
	cout <<"次数为y= "<< y << endl;
}
int A::y = 0;
int main() {
	A a(1), b(2), c(3);
	A* p;
	p = &a;
	a.print();
	b.print();
	c.print();
	A::fun1(&a);
	A::fun1(p);
	p->fun1(&a);
	p->fun1(p);
	(*p).fun1(&a);
	A::fun(a);
	A::fun(b);
	A::fun(c);
	A::show();
	return 0;
}

这里提供了多种调用方式,测试用例:

 

  • 15
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值