😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-06-16 00:05:01
本文未经允许,不得转发!!!
🎄一、概述
在C++编程中,有时需要定义一些成员是属于整个类的,而不是属于某个对象。例如:定义一个数据成员来记录这个类创建了多少个对象。
C++的静态(static)成员就是属于整个类而非属于某个对象的。本文介绍下面几个内容:
1、什么是C++的静态数据成员、静态成员函数?
2、静态数据成员、静态成员函数分别由什么特点?
3、怎么声明、定义静态数据成员、静态成员函数?
4、怎么使用 静态数据成员、静态成员函数?
🎄二、静态(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 的静态数据成员可以使用类的对象、引用或者指针来访问;
- 成员函数可以直接使用静态数据成员,而不需要作用域运算符;
- public 的静态数据成员可以使用
- 5、静态数据成员的类型可以就是它所属的类类型。 而非静态数据成员只能声明成它所属类的指针或引用。
下面通过代码来理解这些特点:
// g++ 17_static_member_data.cpp
#include <iostream>
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 << "gCount=" << &gCount << ", s_ObjCount=" << &CDate::s_ObjCount <<endl; // 打印地址可以看到都是在同一区域
return 0;
}
🎄三、静态(static)成员函数
静态(static)成员函数:是指在类中声明时使用关键字static
修饰的成员函数。静态(static)成员函数可以是 public 的或 private 的。
静态成员函数不包含this指针,所以也不能直接访问非静态成员。
怎样声明、定义静态成员函数?
在类中声明成员函数时使用static关键字修饰,如果该函数在类外定义则不需要加static。参考下面代码:
class CDate
{
public:
static int getObjCount(); // 类内声明静态成员函数
...
private:
static int getObjCountPrv() // 类内声明并定义静态成员函数
{
return s_ObjCountPrv;
}
...
};
// 类外定义静态成员函数,省略static
int CDate::getObjCount()
{
return s_ObjCount;
}
静态成员函数的几个特点:
- 1、静态成员函数属于整个类,而不属于某个对象,所有对象共享静态成员函数;
- 2、静态成员函数在声明时加
static
,类外定义时不加static
; - 3、静态成员函数没有
this
指针,只能访问静态成员,不能访问非静态成员; - 4、静态成员函数可以是 public 的或 private 的
- public 的静态成员函数可以使用
类名作用域
直接访问,private 的静态成员函数只能在类内访问; - public 的静态成员函数可以使用类的对象、引用或者指针来访问;
- 成员函数可以直接使用静态成员函数,而不需要作用域运算符;
- public 的静态成员函数可以使用
下面修改一下上个小节的代码,演示静态成员函数的几个特点:
// g++ 17_static_member_fun.cpp
#include <iostream>
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; // 类内声明静态数据成员
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 << m_year << endl; // 错误,静态成员函数没有`this`指针,只能访问静态成员,不能访问非静态成员;
return s_ObjCount;
}
int main()
{
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;
}
🎄四、总结
👉本文介绍类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码。
类的静态成员是属于整个类的,与对象没有关联。
静态成员在声明时加static,定义时不加static。
公有的静态成员可以直接使用类名作用域访问,或类的对象、指针、引用去访问,私有的只在类内访问。
静态成员函数没有this指针,故只能访问静态成员。
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁