1、类的静态成员变量
1.1 类的静态成员变量的三大特点
特点1:数据类型前面有static,如static在int之前
特点2:变量要在类外初始化,不能在构造函数和其它成员函数里面初始化
特点3:属于类,被所有对象共有,一个对象改变它,对其余所有对象有效。(牵一发动全身)
1.2 类的静态成员变量类外初始化和所有对象共享
// 声明静态成员变量
class MyClass {
public:
static int staticVar;
void display();
privite:
static int staticPri;
};
// 定义和初始化静态成员变量 类的静态成员变量需要在类外分配内存空间 公私都一样
int MyClass::staticVar = 10;
int MyClass::staticPri = 100;
// 实现成员函数
void MyClass::display() {
std::cout << "Static variable value: " << staticVar << std::endl;
}
int main() {
MyClass obj1, obj2;
obj1.display(); // 输出:Static variable value: 10
obj2.display(); // 输出:Static variable value: 10
obj1.staticVar = 20;
obj1.display(); // 输出:Static variable value: 20
obj2.display(); // 输出:Static variable value: 20
return 0;
}
以上代码,我们在test类中分别定义了一个静态成员变量与静态成员函数,首先来看下静态成员变量
-静态成员变量属于整个类所有
-静态成员变量的生命期不依赖于任何对象,为程序的生命周期
-可以通过类名直接访问公有静态成员变量
-所有对象共享类的静态成员变量
-可以通过对象名访问公有静态成员变量
-静态成员变量需要在类外单独分配空间
-静态成员变量在程序内部位于全局数据区 (Type className::VarName = value)
1.3 const修饰的静态成员变量
例如const修饰的静态成员变量 const static long long number;
有两种初始化方式 1)在类内 2)在类外。
2、静态成员函数
特点:
1.前面有static
2.只能访问静态成员变量
3.类外可以通过类名和作用域符号直接访问
类的成员函数有如下特性:
-静态成员函数是类的一个特殊的成员函数 直接使用static关键字修饰即可
-静态成员函数属于整个类所有,没有this指针
-静态成员函数只能直接访问静态成员变量和静态成员函数(但能被其它函数访问)
-可以通过类名直接访问类的公有静态成员函数
-可以通过对象名访问类的公有静态成员函数
这样我们就直接能通过类名去访问静态成员函数,获取对象个数,不通过任何对象。
静态成员函数在C++中的作用很强大,包括后边的介绍的单例模式、二阶构造模式,都用到静态成员函数及静态成员变量。
#include <iostream>
#include <string>
using namespace std;
class test
{
private:
static int m_value; //定义私有类的静态成员变量
public:
test()
{
m_value++;
}
static int getValue() //定义类的静态成员函数
{
return m_value;
}
};
//如果getValue()函数在类内定义,类外实现,则类外实现时,前面不需要加static
int test::m_value = 0;
//类的静态成员变量需要在类外分配内存空间
int main()
{
test t1;
test t2;
test t3;
cout << "test::m_value2 = " << test::getValue() << endl;
//通过类名直接调用公有静态成员函数,获取对象个数
cout << "t3.getValue() = " << t3.getValue() << endl;
//通过对象名调用静态成员函数获取对象个数
system("pause");
}
注意:静态成员变量能被其函数调用,静态成员函数能够被其它成员函数调用!
静态成员函数可以是public也可以是private
属于public性质时,类外访问只能是 类名::静态成员函数 的形式使用它。
属于private性质时,只能被类的其它函数访问。
class MyClass {
private:
static int myStaticFunction() {
return 42;
}
public:
static int publicStaticFunction() {
return myStaticFunction(); // 可以在类内部访问私有静态成员函数
}
};
int main() {
int result = MyClass::publicStaticFunction();
// 可以从类外部调用公共静态成员函数,从而间接访问私有静态成员函数
return 0;
}