C++——静态成员
目录
静态成员的定义
静态成员变量
编程示例
存在的意义
静态成员函数
类内声明
类外定义
编程示例
静态成员的定义
静态成员在C++类中是一个重要的概念,它包括静态成员变量和静态成员函数。静态成员的特点和存在的意义如下:
静态成员变量
1. 定义:
- 共享性:类的所有对象都能访问并修改静态成员变量,这使得对象之间能够进行数据共享。
- 唯一性:无论创建了多少个类的实例(对象),静态成员变量仅有一份拷贝。这意味着对静态成员变量的修改会影响到所有对象。
-
类内声明(声明但不分配内存)
class MyClass { public: static int staticValue; // 声明静态成员变量(类内) // 其他成员... };
2. 初始化:静态成员变量需要在类外进行初始化,通常在类的实现文件中。
- 类外定义(分配内存并初始化)
int MyClass::staticVar = 42; // 在类外定义并初始化(通常在.cpp文件)
3. 访问:静态成员变量可以通过类名直接访问,不需要创建类的对象。也可以通过类的对象访问。
- 通过类名直接访问静态成员变量,例:MyClass::staticValue
- MyClass(类名)+ ::(双冒号)+ (staticValue)静态变量名
- 通过类的对象访问静态成员变量,例:m1.staticValue
- m1(对象)+ .(运算符)+ (staticValue)静态变量名
4. 用途:常用于存储类级别的信息(例如,计数类的实例数量)或全局数据需要被类的所有实例共享。
编程示例
#include <iostream>
using namespace std;
class MyClass
{
public: // 公有权限
static int staticValue; // 声明一个静态成员变量
void setStaticValue(int data); // 声明一个普通变量成员函数
};
// 类外初始化静态成员变量
int MyClass::staticValue = 0;
// 类外定义普通成员函数 setStaticValue
void MyClass::setStaticValue(int data)
{
staticValue += data; // 修改静态成员变量的值
}
int main()
{
cout << "使用类名直接访问静态成员变量:" << MyClass::staticValue << endl << endl;
// 定义两个对象
MyClass m1,m2;
// 两个对象输出的结果都是:0
// m1、m2对象都能访问到静态变量 staticValue 说明静态变量是共享的
// 以下通过类名访问静态成员变量
cout << "m1对象访问静态成员变量的值:" << m1.staticValue << endl;
cout << "m2对象访问静态成员变量的值:" << m2.staticValue << endl<< endl;
// 不管有多少个对象,静态变量只有一份拷贝,表示静态成员变量的唯一性
// 如果其中一个对象,对静态变量进行修改,都会影响到所有对象当问静态变量的结果
cout << "m1对象修改静态变量的值由0改为1" << endl<< endl;
m1.setStaticValue(1);
cout << "m1对象访问静态成员变量的值:" << m1.staticValue << endl;
cout << "m2对象访问静态成员变量的值:" << m2.staticValue << endl;
return 0;
}
存在的意义
共享数据:允许对象之间共享数据,而不需要每个对象都有一份拷贝。
节省内存:对于频繁使用的类,使用静态成员可以节省内存。
独立于对象的功能:静态成员函数提供了一种在不创建对象的情况下执行操作的方法,这对于实现工具函数或管理类级别状态很有用。
静态成员函数
1. 定义:静态成员函数是可以不依赖于类的实例(对象)而被调用的函数。它不能访问类的非静态成员变量和非静态成员函数。
-
类内声明
在类声明中使用
static
关键字修饰函数:class MyClass { public: static void staticFunction(); // 声明静态成员函数 };
-
类外定义
在类外部定义函数实现时不需要重复
static
关键字:void MyClass::staticFunction() { // 函数实现 std::cout << "静态成员函数被调用" << std::endl; }
2. 访问:类似于静态成员变量,静态成员函数可以通过类名直接调用,也可以通过类的实例(对象)调用。
- 通过类名直接调用,例:MyClass::getStaticValueNumFunc()
- 通过对象直接调用,例:m1.getStaticValueNumFunc()
3. 用途:常用于实现与具体对象无关的功能,或访问静态成员变量。
编程示例
#include <iostream>
using namespace std;
class MyClass
{
private: // 私有权限
static int staticValueNum; // 声明静态成员变量
public: // 公有权限
static int getStaticValueNumFunc();
MyClass() // 构造函数
{
staticValueNum++;
}
~MyClass() //析构函数
{
staticValueNum--;
}
};
// 在类外初始化静态变量
int MyClass::staticValueNum = 0;
// 在类外定义静态函数
int MyClass::getStaticValueNumFunc()
{
return staticValueNum;
}
int main()
{
cout << "通过类名访问静态成员函数:" << MyClass::getStaticValueNumFunc() << endl;
// 创建对象
MyClass m1;
cout << "通过对象访问静态成员函数:" << m1.getStaticValueNumFunc() << endl;
return 0;
}