C++ 静态成员函数(示例)
C++ 中的静态函数是什么?
在 C++ 类中,静态成员是属于类的成员,而不是属于其对象的成员。您只会拥有该成员的一份副本。无论您创建多少个对象,情况都是如此。
当类函数被定义为静态时,所有类对象共享一个静态类成员。因此,无需创建任何类对象即可访问静态函数,并且它独立于类对象。C++ 中的静态数据成员只能访问类外的其他静态函数。
为什么使用静态函数?
与 C++ 全局函数不同,静态函数只能在声明文件范围内访问。如果需要限制对函数的访问,请将其设为静态。
使用静态函数可避免在另一个文件中重用相同的函数名。
在 C++ 中定义静态函数
语法
static int myfunc(void) { cout("Example of C++ static function "); }
在上面的示例中,我们定义了一个名为 myfunc 的静态函数。请注意定义中使用了 static 关键字。该关键字放在函数名前面。
C++ 中的静态成员函数
当一个函数成员被声明为静态时,它就独立于类中的其他对象。即使不存在其他类对象,您也可以调用静态成员函数。
要访问类名,您应该使用类名和作用域解析运算符(::)
。静态函数只能访问其他静态函数、静态数据成员以及类外的其他函数。静态成员函数的范围在类内,并且它们不能访问 this 类指针。
示例 1
#include<iostream> using namespace std; class BoxClass { public: static int count; BoxClass(double l = 2.0, double b = 2.0, double h = 2.0) { cout << "Class constructor called." << endl; length = l; breadth = b; height = h; count++; } double getVolume() { return length * breadth * height; } static int getCount() { return count; } private: double length; double breadth; double height; }; int BoxClass::count = 0; int main(void) { cout << "Inital value of count is : " << BoxClass::getCount() << endl; BoxClass Box1(3.2, 1.4, 1.8); BoxClass Box2(7.5, 4.0, 4.0); cout << "Final value of count is : " << BoxClass::getCount() << endl; return 0; }
输出
这是代码的屏幕截图:
代码解释
- 在 C++ 程序中包含 iostream 头文件以使用其函数。
- 在代码中包含 std 命名空间,以便在不调用它的情况下使用其类。
- 创建一个名为 BoxClass 的类。
- 使用 public 访问修饰符将类成员标记为公共可访问。
- 声明一个名为 count 的静态类成员。
- 使用类构造函数初始化三个双精度类型的变量。
- 在控制台打印一些文本。endl(end line)函数会将鼠标光标移到下一行。
- 将 l 的值初始化为变量 length。
- 将 b 的值初始化为变量 breadth。
- 将 h 的值初始化为变量 height。
- 然后,每次创建新对象时,将 count 变量的值增加 1。
- 构造函数体的结束。
- 创建一个名为 doublevolume() 的函数。
- 定义 doubleVolume() 函数的返回值。它应返回 length、breadth 和 height 变量的乘积。
- doubleVolume() 函数体结束。
- 声明一个名为 getCount() 的静态函数。
- getCount() 函数应返回 count 变量的值。
- getCount() 函数体结束。
- 使用 private 访问修饰符将类成员标记为公共可访问。
- 声明一个名为 length 的双精度数据类型的类成员。它将是私有可访问的。
- 声明一个名为 breadth 的双精度数据类型的类成员。它将是私有可访问的。
- 声明一个名为 height 的双精度数据类型的类成员。它将是私有可访问的。
- BoxClass 类体结束。
- 然后初始化 BoxClass 类的静态成员。
- 调用 main() 函数。C++ 程序逻辑应添加到该函数的主体内。
- 在创建新对象之前,在控制台打印一些文本,说明当前对象的数量。
- 声明一个名为 Box1 的对象,它是 BoxClass 类的实例之一。应在括号内指定 breadth、length 和 height 的值。
- 声明一个名为 Box2 的对象,它是 BoxClass 类的实例。应在括号内指定 breadth、length 和 height 的值。
- 创建新对象后,在控制台打印一些文本,说明当前对象的数量。
- C++ 程序必须在成功完成后返回值。C++ 程序必须在成功完成后返回值。
- main() 函数主体的结束。
访问静态函数
您无需创建类对象即可访问静态函数。相反,您可以使用类名和作用域解析运算符(::)
。
语法
className::funcName
上面,className 是定义了静态函数的类的名称。funcName 是分配给静态函数的名称。
示例 2
#include<iostream> using namespace std; class MyClass { public: static void msgFunc() { cout << "Welcome to Guru99!"; } }; int main() { MyClass::msgFunc(); }
输出
这是代码的屏幕截图:
代码解释
- 在程序中包含 iostream 头文件以使用其函数。
- 在代码中包含 std 命名空间,以便在不调用它的情况下使用其类。
- 创建一个名为 MyClass 的类。
- 使用 public 访问修饰符将类成员标记为公共可访问。
- 声明一个名为 msgFunc() 的静态函数。static 关键字使该函数成为静态的。
- 指定调用上述函数时要打印到控制台的文本。
- msgFunc() 函数体结束。
- 结束类体。
- 调用 main() 函数。
- 调用名为 msgFunc() 的静态函数。
- main() 函数主体的结束。
访问静态变量
静态变量属于类,而不是类对象。如果静态变量是 public 的,则可以使用类名和作用域解析运算符访问它。但是,如果静态成员是 private 的,则无法做到这一点。
通常,使用公共函数访问私有变量。但是,必须创建一个类实例/对象。解决方案是使用静态函数。
示例 3:C++ 类中的静态变量
#include<iostream> using namespace std; class AClass { private: static int myvar; public: static int getVar() { return myvar; } }; int AClass::myvar = 23; int main() { cout <<"The value of myvar is: "<< AClass::getVar() << '\n'; }
输出
这是代码的屏幕截图:
代码解释
- 在程序中包含 iostream 头文件。
- 在此程序中包含 std 命名空间,以便在不调用它的情况下使用其类。
- 创建一个名为 AClass 的类。
- 使用 private 访问修饰符使即将创建的变量 myvar 成为私有可访问的。
- 创建一个名为 myvar 的静态整数变量。
- 使用 public 访问修饰符,该修饰符将即将创建的函数 getVar() 标记为公共可访问。
- 创建一个名为 getVar() 的静态函数。
- getVar() 函数应能返回变量 myvar 的值。
- getVar() 函数体结束。
- AClass 类体结束。
- 将变量 myvar 的值赋为 23。我们为此使用了类名和作用域解析运算符。
- 调用 main() 函数。
- 将变量 myVar 的值与控制台上的其他文本一起打印出来。我们使用了类名、静态函数和作用域解析运算符来访问该变量的值。
- main() 函数体结束。
静态函数中的 this 指针
静态函数不附加到对象。这就是为什么静态函数没有 this 指针的原因。对象的指针通常指向其当前正在处理的对象。由于静态函数不与对象一起工作,因此不需要 this 指针。
静态函数可以直接访问其他静态成员。但是,非静态成员的情况并非如此。原因是而非静态成员必须属于一个对象,但静态函数没有对象可以操作。
示例4
可以在类声明外部定义静态函数。让我们演示一下
#include<iostream> using namespace std; class NumGenerator { private: static int nextNum; public: static int getNextNum(); }; int NumGenerator::nextNum = 1; int NumGenerator::getNextNum() { return nextNum++; } int main() { for (int count = 0; count < 5; ++count) std::cout << "The next number is: " << NumGenerator::getNextNum() << '\n'; return 0; }
输出
这是您的代码的屏幕截图
代码解释
- 在代码中包含 iostream 头文件以使用其函数。
- 包含 std 命名空间到我们的代码中以使用其类而无需调用其名称。
- 创建一个名为 NumGenerator 的类。
- 使用 private 访问修饰符标记即将创建的变量,使其成为私有可访问的。
- 创建一个名为 nextNum 的静态整数变量。
- 使用 public 访问修饰符,它有助于您将即将创建的变量标记为公共可访问。
- 声明一个名为 getNextNum() 的静态函数。
- 类主体的结束。
- 将 nextNum 变量的值赋为 1。我们通过类名、变量名和作用域解析运算符来完成此操作。
- 在类外部定义 getNextNum() 静态函数。
- 指定调用上述函数时要执行的操作。它会将变量 nextNum 的值增加 1。
- getNextNum() 函数定义结束。
- 调用 main() 函数。C++ 程序逻辑应添加到此函数的主体内。
- 使用for 循环创建一个名为 count 的变量。此变量的值应从 0 递增到 4。每次迭代后,变量的值将增加 1。
- 在每次迭代时,将 nextNum 变量的值与控制台上的其他文本一起打印出来。该值是通过 getNextNum() 函数访问的。
- 此 C++ 程序必须在成功完成后返回值。
- main() 函数结束。
摘要
- C++ 静态成员是属于类的成员,而不是类对象的成员。
- 无论您创建多少个对象,您将只有一份静态成员的副本。
- 所有类对象共享每个静态类成员。
- 将类函数定义为静态后,它将独立于类对象。
- 即使您不创建任何类对象,也可以访问静态函数。
- 但是,静态函数没有 this 对象,它指向类对象。