【C++ | 静态成员】类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码

2024-06-28 1480阅读

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀

🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭

⏰发布时间⏰:2024-06-16 00:05:01

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、静态(static)数据成员
  • 🎄三、静态(static)成员函数
  • 🎄四、总结

    【C++ | 静态成员】类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码

    【C++ | 静态成员】类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码

    🎄一、概述

    在C++编程中,有时需要定义一些成员是属于整个类的,而不是属于某个对象。例如:定义一个数据成员来记录这个类创建了多少个对象。

    C++的静态(static)成员就是属于整个类而非属于某个对象的。本文介绍下面几个内容:

    1、什么是C++的静态数据成员、静态成员函数?

    2、静态数据成员、静态成员函数分别由什么特点?

    3、怎么声明、定义静态数据成员、静态成员函数?

    4、怎么使用 静态数据成员、静态成员函数?


    【C++ | 静态成员】类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码

    🎄二、静态(static)数据成员

    静态(static)数据成员:是指在类中声明时使用关键字static修饰的数据成员。 静态数据成员可以是 public 的或 private 的。本质上就是一个全局变量,只不过受 类名作用域 和 权限 控制。

    怎样声明、定义静态数据成员?

    在类中声明时使用static关键字修饰,一般在类外定义并初始化,类外定义时不需要加static。参考下面代码:

    class CDate
    {
    public:
    	static int s_ObjCount;	// 静态数据成员声明
    	...
    private:
    	static int s_ObjCount2;
    	...
    };
    // 静态数据成员定义
    int CDate::s_ObjCount = 0;
    int CDate::s_ObjCount2= 0;
    

    静态数据成员的几个特点:

    • 1、静态数据成员属于整个类,而不属于某个对象,所有对象共享静态数据成员;
    • 2、静态数据成员一般在类内声明、在类外定义,声明时加static修饰,定义时不加static;
    • 3、静态数据成员定义后位于程序的全局数据区,并一直存在于程序的整个生命周期中;
    • 4、静态数据成员可以是 public 的或 private 的
      • public 的静态数据成员可以使用类名作用域直接访问,private 的静态数据成员只能在类内访问;
      • public 的静态数据成员可以使用类的对象、引用或者指针来访问;
      • 成员函数可以直接使用静态数据成员,而不需要作用域运算符;
      • 5、静态数据成员的类型可以就是它所属的类类型。 而非静态数据成员只能声明成它所属类的指针或引用。

        下面通过代码来理解这些特点:

        // g++ 17_static_member_data.cpp 
        #include 
        using namespace std;
        class CDate
        {
        public:
        	CDate(int year, int mon, int day)
        	{
        		m_year = year;
        		m_mon = mon;
        		m_day = day;
        		
        		// 成员函数可以直接使用静态数据成员,而不需要作用域运算符
        		s_ObjCount++;
        		s_ObjCountPrv++;
        	}
        public:
        	static int s_ObjCount;		// 类内声明静态数据成员
        private:
        	static int s_ObjCountPrv;	// 类内声明静态数据成员
        	static CDate s_Date;		// 静态数据成员可以用所属类类型
        	//CDate date;		//报错:field ‘date’ has incomplete type
        	CDate *pDate;	// 非静态数据成员,只能声明成所属类的指针或引用
        	int m_year;
        	int m_mon;
        	int m_day;
        };
        static int gCount = 0;
        // 类外定义静态数据成员
        int CDate::s_ObjCount = 0;
        int CDate::s_ObjCountPrv= 0;
        int main()
        {
        	CDate::s_ObjCount = 0;		// public静态数据成员,使用类名作用域直接访问
        	//CDate::s_ObjCountPrv = 0;	// 报错:private静态数据成员只能在类内访问
        	
        	CDate date(2024,06,14);
        	date.s_ObjCount = 0;	// public静态数据成员,可以使用类的对象访问
        	
        	CDate rDate = date;	
        	rDate.s_ObjCount = 1;	// public静态数据成员,可以使用类的引用访问
        	
        	CDate *pDate = &date;
        	pDate->s_ObjCount = 1;	// public静态数据成员,可以使用类的指针访问
        	
        	cout 
        public:
        	static int getObjCount();	// 类内声明静态成员函数
        	...
        private:
        	static int getObjCountPrv()	// 类内声明并定义静态成员函数
        	{
        		return s_ObjCountPrv;
        	}
        	...
        };
        // 类外定义静态成员函数,省略static
        int CDate::getObjCount()
        {
        	return s_ObjCount;
        }
        
        public:
        	CDate(int year, int mon, int day)
        	{
        		m_year = year;
        		m_mon = mon;
        		m_day = day;
        		
        		// 成员函数可以直接使用静态数据成员,而不需要作用域运算符
        		s_ObjCount++;
        		s_ObjCountPrv++;
        	}
        public:
        	static int s_ObjCount;		// 类内声明静态数据成员
        	static int getObjCount();	// 类内声明静态成员函数
        private:
        	static int s_ObjCountPrv;	// 类内声明静态数据成员
        	static CDate s_Date;		// 静态数据成员可以用所属类类型
        	//CDate date;		//报错:field ‘date’ has incomplete type
        	CDate *pDate;	// 非静态数据成员,只能声明成所属类的指针或引用
        	int m_year;
        	int m_mon;
        	int m_day;
        	
        	static int getObjCountPrv()	// 类内声明并定义静态成员函数
        	{
        		return s_ObjCountPrv;
        	}
        };
        static int gCount = 0;
        // 类外定义静态数据成员
        int CDate::s_ObjCount = 0;
        int CDate::s_ObjCountPrv= 0;
        // 类外定义静态成员函数,省略static
        int CDate::getObjCount()
        {
        	// cout 
        	CDate::getObjCount();	// public静态成员函数,使用类名作用域直接访问
        //	Date::getObjCountPrv();	// 报错:private静态成员函数只能在类内访问
        	
        	CDate date(2024,06,14);
        	date.getObjCount();		// public静态成员函数,可以使用类的对象访问
        	
        	CDate rDate = date;	
        	rDate.getObjCount();	// public静态成员函数,可以使用类的引用访问
        	
        	CDate *pDate = &date;
        	pDate-getObjCount();	// public静态成员函数,可以使用类的指针访问
        	return 0;
        }
        
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]