C++类静态成员与类静态成员函数详解
1. 什么是C++类的静态成员和静态成员函数?
1.1 静态成员
顾名思义,静态成员属于类而不是某个对象,与类的实例化无关。也就是说,无论有多少个类的对象被创建,静态成员的内存只分配一次,所有的类对象都共享这一内存空间。因此,静态成员也称为"类成员"。
C++类的静态成员可以是静态变量或静态函数。其中静态变量也称为类变量,是所有类对象的公共变量,同时静态变量可以被类的所有方法所访问,而不必通过对象来访问。
实例化后的普通成员变量是属于对象的,每个对象都有自己的一份。而静态成员变量不属于任何对象,所有的对象共享同一份静态成员变量的内存空间。
1.2 静态成员函数
类静态成员函数是不与任何类对象相关联的成员函数,其特点如下:
- 它们没有this指针,也就是说,静态成员函数中不能访问非静态成员变量或成员函数,只能访问静态成员变量和成员函数。
- 静态成员函数只能调用静态成员函数或访问静态成员变量,不能调用非静态成员函数或访问非静态成员变量。
静态成员函数主要用于实现与类本身相关的功能,比如类的初始化或清理等。
2. C++类静态成员的定义和访问
2.1 静态成员变量的定义和访问
C++类的静态成员变量定义时需要加上static关键字,并且必须在类中声明,但是在类外面定义,也就是在类定义之外的文件中定义。
class Person{
public:
static int num; // 声明为静态变量
static void setNum(int n);
};
int Person::num = 0; // 静态成员变量定义
上述代码定义了一个名为"num"的静态成员变量,初始值为0。在类的外部,需要通过类名加作用域限定符来访问静态成员变量。
#include <iostream>
#include "Person.h"
using namespace std;
int main()
{
Person p1, p2;
p1.setNum(1);
cout << "p1.num = " << p1.num << endl; // 输出: p1.num = 1
cout << "p2.num = " << p2.num << endl; // 输出: p2.num = 1
p2.setNum(2);
cout << "p1.num = " << p1.num << endl; // 输出: p1.num = 2
cout << "p2.num = " << p2.num << endl; // 输出: p2.num = 2
return 0;
}
上述代码中,我们创建了两个Person对象p1和p2,在p1中将num的值设置为1,然后通过类名访问p2的num时,发现其值也为1。这是因为静态成员变量是属于类的,所以p1和p2共享同一份num的内存空间。
2.2 静态成员函数的定义和访问
C++类中的静态成员函数定义时也需要加上static关键字。
class Person{
public:
static void setNum(int n); // 声明为静态函数
};
void Person::setNum(int n) // 静态成员函数定义
{
num = n; // 静态成员函数中可以直接访问静态成员变量
}
静态成员函数的访问同样需要通过类名加作用域限定符来实现。
#include <iostream>
#include "Person.h"
using namespace std;
int main()
{
Person::setNum(10);
cout << "num = " << Person::num << endl; // 输出: num = 10
return 0;
}
3. 示例
以下是一个示例,演示了如何使用静态成员变量和静态成员函数实现"水果类":
#include <iostream>
using namespace std;
class Fruit{
public:
static int count; // 静态成员变量
Fruit(const char* name){ // 构造函数
this->name = name;
count++; // 每创建一个Fruit对象,count自增1
}
const char* getName(){ // 普通成员函数
return name;
}
static void displayCount(){ // 静态成员函数
cout << "Total " << count << " fruits." <<endl; // 访问静态成员变量
}
private:
const char* name;
};
int Fruit::count = 0; // 静态成员变量的定义与初始化
int main()
{
Fruit apple("apple");
Fruit banana("banana");
Fruit orange("orange");
Fruit::displayCount(); // 静态成员函数的调用
cout << apple.getName() << endl;
cout << banana.getName() << endl;
cout << orange.getName() << endl;
return 0;
}
上述代码定义了一个名为"Fruit"的类,其中count成员变量是静态的,而displayCount函数也是静态的。在main函数中,我们创建了三个Fruit对象,每次创建一个对象,count就自增1。最后通过Fruit::displayCount()来调用静态成员函数displayCount,输出count的值为3。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类静态成员与类静态成员函数详解 - Python技术站