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;
}

输出

Static Member Function

这是代码的屏幕截图:

Static Member Function

代码解释

  1. 在 C++ 程序中包含 iostream 头文件以使用其函数
  2. 在代码中包含 std 命名空间,以便在不调用它的情况下使用其类。
  3. 创建一个名为 BoxClass 的类。
  4. 使用 public 访问修饰符将类成员标记为公共可访问。
  5. 声明一个名为 count 的静态类成员。
  6. 使用类构造函数初始化三个双精度类型的变量。
  7. 在控制台打印一些文本。endl(end line)函数会将鼠标光标移到下一行。
  8. 将 l 的值初始化为变量 length。
  9. 将 b 的值初始化为变量 breadth。
  10. 将 h 的值初始化为变量 height。
  11. 然后,每次创建新对象时,将 count 变量的值增加 1。
  12. 构造函数体的结束。
  13. 创建一个名为 doublevolume() 的函数。
  14. 定义 doubleVolume() 函数的返回值。它应返回 length、breadth 和 height 变量的乘积。
  15. doubleVolume() 函数体结束。
  16. 声明一个名为 getCount() 的静态函数。
  17. getCount() 函数应返回 count 变量的值。
  18. getCount() 函数体结束。
  19. 使用 private 访问修饰符将类成员标记为公共可访问。
  20. 声明一个名为 length 的双精度数据类型的类成员。它将是私有可访问的。
  21. 声明一个名为 breadth 的双精度数据类型的类成员。它将是私有可访问的。
  22. 声明一个名为 height 的双精度数据类型的类成员。它将是私有可访问的。
  23. BoxClass 类体结束。
  24. 然后初始化 BoxClass 类的静态成员。
  25. 调用 main() 函数。C++ 程序逻辑应添加到该函数的主体内。
  26. 在创建新对象之前,在控制台打印一些文本,说明当前对象的数量。
  27. 声明一个名为 Box1 的对象,它是 BoxClass 类的实例之一。应在括号内指定 breadth、length 和 height 的值。
  28. 声明一个名为 Box2 的对象,它是 BoxClass 类的实例。应在括号内指定 breadth、length 和 height 的值。
  29. 创建新对象后,在控制台打印一些文本,说明当前对象的数量。
  30. C++ 程序必须在成功完成后返回值。C++ 程序必须在成功完成后返回值。
  31. 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();
}

输出

Accessing Static Functions

这是代码的屏幕截图:

Accessing Static Functions

代码解释

  1. 在程序中包含 iostream 头文件以使用其函数。
  2. 在代码中包含 std 命名空间,以便在不调用它的情况下使用其类。
  3. 创建一个名为 MyClass 的类。
  4. 使用 public 访问修饰符将类成员标记为公共可访问。
  5. 声明一个名为 msgFunc() 的静态函数。static 关键字使该函数成为静态的。
  6. 指定调用上述函数时要打印到控制台的文本。
  7. msgFunc() 函数体结束。
  8. 结束类体。
  9. 调用 main() 函数。
  10. 调用名为 msgFunc() 的静态函数。
  11. 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';
}

输出

Accessing Static Variables

这是代码的屏幕截图:

Accessing Static Variables

代码解释

  1. 在程序中包含 iostream 头文件。
  2. 在此程序中包含 std 命名空间,以便在不调用它的情况下使用其类。
  3. 创建一个名为 AClass 的类。
  4. 使用 private 访问修饰符使即将创建的变量 myvar 成为私有可访问的。
  5. 创建一个名为 myvar 的静态整数变量。
  6. 使用 public 访问修饰符,该修饰符将即将创建的函数 getVar() 标记为公共可访问。
  7. 创建一个名为 getVar() 的静态函数。
  8. getVar() 函数应能返回变量 myvar 的值。
  9. getVar() 函数体结束。
  10. AClass 类体结束。
  11. 将变量 myvar 的值赋为 23。我们为此使用了类名和作用域解析运算符。
  12. 调用 main() 函数。
  13. 将变量 myVar 的值与控制台上的其他文本一起打印出来。我们使用了类名、静态函数和作用域解析运算符来访问该变量的值。
  14. 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;
}

输出

this Pointer in Static Functions

这是您的代码的屏幕截图

this Pointer in Static Functions

代码解释

  1. 在代码中包含 iostream 头文件以使用其函数。
  2. 包含 std 命名空间到我们的代码中以使用其类而无需调用其名称。
  3. 创建一个名为 NumGenerator 的类。
  4. 使用 private 访问修饰符标记即将创建的变量,使其成为私有可访问的。
  5. 创建一个名为 nextNum 的静态整数变量。
  6. 使用 public 访问修饰符,它有助于您将即将创建的变量标记为公共可访问。
  7. 声明一个名为 getNextNum() 的静态函数。
  8. 类主体的结束。
  9. 将 nextNum 变量的值赋为 1。我们通过类名、变量名和作用域解析运算符来完成此操作。
  10. 在类外部定义 getNextNum() 静态函数。
  11. 指定调用上述函数时要执行的操作。它会将变量 nextNum 的值增加 1。
  12. getNextNum() 函数定义结束。
  13. 调用 main() 函数。C++ 程序逻辑应添加到此函数的主体内。
  14. 使用for 循环创建一个名为 count 的变量。此变量的值应从 0 递增到 4。每次迭代后,变量的值将增加 1。
  15. 在每次迭代时,将 nextNum 变量的值与控制台上的其他文本一起打印出来。该值是通过 getNextNum() 函数访问的。
  16. 此 C++ 程序必须在成功完成后返回值。
  17. main() 函数结束。

摘要

  • C++ 静态成员是属于类的成员,而不是类对象的成员。
  • 无论您创建多少个对象,您将只有一份静态成员的副本。
  • 所有类对象共享每个静态类成员。
  • 将类函数定义为静态后,它将独立于类对象。
  • 即使您不创建任何类对象,也可以访问静态函数。
  • 但是,静态函数没有 this 对象,它指向类对象。