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

C++_静态数据成员和静态成员函数

2016-11-11 18:12 232 查看
1.如何实现属于某个类的所有对象共享某个数据?

解决的办法:

将所要共享的数据说明为全局变量,但这将破坏数据的封装性;

较好的解决办法是将所要共享的数据说明为类的静态成员。 

2.静态数据成员是类中所有对象共享的成员,而不是某个对象的成员,所以必须对它初始化,且对它的初始化不能在构造函数中进行;静态数据成员不属于任何对象, 它不因对象的建立而产生,也不因对象的析构而删除,它是类定义的一部分,所以使用静态数据成员不会破坏类的隐蔽性。

3.定义

静态数据成员:用关键字static声明,该类的所有对象维护该成员的同一个拷贝,必须在类外定义和初始化,用::来指明所属的类;

静态成员函数:类外代码可以使用类名和作用域操作符来调用静态成员函数;静态成员函数只能引用属于该类的静态数据成员和静态成员函数。

例1:

//具有静态数据成员和静态成员函数的point类
#include <iostream>
using namespace std;
class point
{
private:
int x;
int y;
static int count;//静态成员声明
public:
point(int vx = 0, int vy = 0) :x(vx), y(vy) { count++; }//带参数的构造函数
point(point &p);//拷贝构造函数
static void showCount();//静态函数成员
void print();
~point() { count--; }//析构函数
};
int point::count = 0;//在类外定义和初始化静态成员
point::point(point & p)
{
x = p.x + 2;
y = p.y + 3;
count++;
}
void point::showCount()
{
cout << "count:" << count << endl;
}
void point::print()
{
cout << "x = " << x << ",y = " << y << endl;
}
int main()
{
point p1(1, 2);//创建对象
p1.print();
p1.showCount();
point p2(p1);//调用拷贝构造函数
p2.print();
p1.showCount();
getchar();
}
/*
运行结果:
x = 1, y = 2
count = 1
x = 3, y = 5
count = 2
*/
例2:

#include <iostream>
using namespace std;
enum access_value{shared,in_use,locked,unlocked};//定义枚举类型,表示资源的状态

class access
{
private:
static access_value acs;//定义静态数据成员,只能取上述枚举类型中的值
public:
static void set_access(access_value a);//设定资源的状态
static access_value get_access();//获取资源的状态
};

void access::set_access(access_value a)//设定资源的状态
{
acs = a;
}

access_value access::get_access()//获取资源的状态
{
return acs;
}

access_value access::acs = shared;//初始化静态数据成员
char* value(int x)//根据数字返回枚举类型
{
static char a[4][10] = { "shared","in_use","locked","unlocked"};
switch (x)
{
case 0:return a[0]; break;
case 1:return a[1]; break;
case 2:return a[2]; break;
case 3:return a[3]; break;
default:
break;
}
}

int main()
{
access obj1;//定义对象
cout << "obj1 access:" << value(obj1.get_access()) << endl;
obj1.set_access(unlocked);
cout << "obj1 access:" << value(obj1.get_access()) << endl;
getchar();
}
/*
运行结果:
obj1 access:shared
obj1 access:unlocked
*/




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: