C++类的静态成员

一、基本介绍

在c++类中声明成员时可以加上static 关键字,这样声明的成员就叫做静态成员(包括 数据成员和成员函数)。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classtest{
public :
test(){}
~test(){}
public :
//静态成员函数
staticintgetCount(){
returnm_nCount;
}
private :
//静态数据成员
staticintm_nCount;
};
inttest::m_nCount=0;

      静态成员的特性:

       不管这个类创建了多少个对象,而其静态成员只有一个拷贝(副本),这个拷贝被所有属于这个类的对象共享。

二、静态数据成员

       

      定义格式:

            static 数据类型 静态数据成员名;

      初始化格式:

            数据类型 类名::静态数据成员名 =  初始化值;

      公有静态数据成员的访问格式:

            1.  类名::静态数据成员名

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

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

       说明:

             1. 静态数据成员属于类,普通数据成员属于某一对象;

             2. 在类中不给静态数据成员分配内存空间;

             3. 静态数据成员与静态变量一样,是在编译时创建并初始化,它在该类的任何对象被建立之前就存在;

             4. 静态数据成员不能在类中进行初始化,必须在类外的其他地方为它提供定义;一般在main()开始之前、类的声明之后的特殊地

                 带为它提供定义和初始化;

             5. 私有静态数据成员不能被类外部函数访问,也不能用对象进行访问。

       例子:

<span style="font-size:18px;">#include <iostream>
using namespace std;


class KMyClass
{
private:
	static int i;                       //声明i为私有静态数据成员
public:
	static int j;                       //声明j为公有静态数据成员
	int Geti()
	{
		return i;
	}
	int Getj()
	{
		return j;
	}
};

int KMyClass::i = 0;                         //静态数据成员初始化
int KMyClass::j = 0;

int main()
{
	KMyClass::j = 200;                   //公有静态数据成员可以在对象定义之前被访问
	cout<<"KMyClass::j = "<<KMyClass::j<<endl;
	KMyClass ob1, ob2;
	cout<<"ob1.i = "<<ob1.Geti()<<endl;
	cout<<"ob1.j = "<<ob1.Getj()<<endl;
	cout<<"ob2.i = "<<ob2.Geti()<<endl;
	cout<<"ob2.j = "<<ob2.Getj()<<endl;
	ob1.j = 300;                          //公有静态数据成员也可通过对象进行访问
	cout<<"ob1.j = "<<ob1.Getj()<<endl;   //静态数据成员是对象的共享数据项
	cout<<"ob2.j = "<<ob2.Getj()<<endl;
	return 0;
}</span>

程序结果:

                    MyClass::j = 200;

                    ob1.i = 0;

                    ob1.j = 200;

                    ob2.i = 0;

                    ob2.j = 200;

                    ob1.j = 300;

                    ob2.j = 300;


三、静态成员函数


      定义格式:

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

      公有静态数据成员的访问格式:

            1.  类名::静态成员函数名(实参表)

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

            3. 对象指针->静态成员函数名(实参表)

       说明:

             1. 静态成员函数可以定义成内嵌的,也可以在类外定义(在类外定义时,不要用static前缀);

             2. 一般情况下,静态成员函数主要用来返回全局变量或同一个类中的静态数据成员(当它与静态数据成员一起使用时,达到了对同

                 一个类中对象之间共享数据进行维护的目的);

             3. 编译系统将静态成员函数限定为内部连接,即,与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函

                 数使用的安全性,这是使用静态成员函数的另一个原因;

             4. 在一般的成员函数中,都隐含有一个this指针,用来指向对象自身,而在静态成员函数中是没有this指针的,因为它不与特定的

                 对象想联系,调用时使用如下格式较好:     类名::静态成员函数名(); 

             5. 私有静态成员函数不能被类外部函数和对象访问。

        例子:

#include <iostream> 
using namespace std;

class Small_Cat
{
private:
	double weight;
	static double total_weight;
	static double total_number;
public:
	Small_Cat(double w)
	{
		weight = w;
		total_weight += w;
		total_number++;
	}

	void Display()
	{
        cout<<"The small_cat weights "<<weight<<" pounds/n";
	}

	static void Total_Disp()               //静态成员函数,显示小猫的只数和总重量
	{
		cout<<total_number<<" small_cat total weight "<<total_weight<<" pounds"<<endl;
	}
};

double Small_Cat::total_weight = 0;
double Small_Cat::total_number = 0;

int main()
{
	Small_Cat w1(1.8), w2(1.6), w3(1.5);
	w1.Display();
	w1.Total_Disp();
	w2.Display();
	w2.Total_Disp();
	w3.Display();
	w3.Total_Disp();
	Small_Cat::Total_Disp();
	return 0;
}
四、静态数据成员和普通数据成员区别

静态 数据成员和普通数据成员区别较大,体现在下面几点:
(1)普通 数据成员属于类的一个具体的对象,只有对象被创建了,普通数据成员才会被分配内存。而静态数据成员属于整个类,即使没有任何对象创建,类的静态数据 成员变量也存在。
(2)因为类的静态数据成员的存在不依赖与于任何类对象的存在,类的静态数据成员应该在代码中被显示的初始化,一定要在类外进行,例如上例。
(3)外部访问类的静态成员只能通过类名来访问,例如:test::getCount()。
(4)类的静态成员函数无法直接访问普通 数据成员(可以通过对象名间接的访问),而类的任何成员函数都可以访问类的静态数据成员。
(5)静态成员和类的普通成员一样,也具有public、protected、private3种访问级别,也可以具有返回值、const 修饰符等参数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值