静态成员函数 C++ (例子)

什么是静态函数 C++?

In C++ 类中,静态成员是属于类而不是其对象的类成员。您将只有一个成员资格副本。无论您创建了多少个对象,情况都是如此。

当类函数定义为静态时,所有类对象共享一个静态类成员。因此,无需创建任何类对象即可访问静态函数,并且该函数独立于 类对象. 静态数据成员 C++ 只能访问类外部的其他静态函数。

为什么要使用静态函数?

不比 C++ 全局函数,静态函数只能从声明文件访问。如果需要限制对函数的访问,请将其设为静态。

使用静态函数来限制在另一个文件中重复使用相同的函数名。

在中定义静态函数 C++

语法:

static int myfunc(void)
{
    cout("Example of C++ static function ");
}

在上面的例子中,我们定义了一个名为 myfunc 的静态函数。请注意定义中使用了 static 关键字。该关键字位于函数名称之前。

静态成员函数 C++

当函数成员被声明为静态时,它将独立于类中的其他对象。即使不存在其他类对象,也可以调用静态成员函数。

要访问类名,应该使用类名和范围解析运算符 (::)静态函数只能访问类外的其他静态函数、静态数据成员和其他函数,静态成员函数的作用域在类内部,不能访问本类指针。

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

输出:

静态成员函数

以下是代码截图:

静态成员函数

代码说明:

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

输出:

访问静态函数

以下是代码截图:

访问静态函数

代码说明:

  1. 在我们的程序中包含iostream头文件以使用它的功能。
  2. 在代码中包含 std 命名空间以便使用其类而不调用它。
  3. 创建一个名为 MyClass 的类。
  4. 使用公共访问修饰符将类成员标记为可公开访问。
  5. 声明一个名为 msgFunc() 的静态函数。static 关键字使该函数成为静态的。
  6. 指定调用/调用上述函数后在控制台上打印的文本。
  7. msgFunc() 函数体结束。
  8. 结束课堂主体。
  9. 调用 main() 函数。
  10. 调用名为 msgFunc() 的静态函数。
  11. 函数 main() 主体结束。

访问静态变量

静态变量属于类,而不是类对象。如果静态变量是公共的,则可以使用类名和范围解析运算符访问它。但是,如果静态成员是私有的,则这是不可能的。

通常,使用公共函数访问私有变量。但是,必须创建类实例/对象。解决方案是使用静态函数。

示例 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';
}

输出:

访问静态变量

以下是代码截图:

访问静态变量

代码说明:

  1. 在我们的程序中包含 iostream 头文件。
  2. 在此程序中包含 std 命名空间以便无需调用即可使用其类。
  3. 创建一个名为 AClass 的类。
  4. 使用 private 访问修饰符使变量 myvar 可私有访问。
  5. 创建一个名为 myvar 的静态整型变量。
  6. 使用公共访问修饰符将函数 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 指针

这是您的代码的屏幕截图:

静态函数中的 this 指针

代码说明:

  1. 在我们的代码中包含 iostream 头文件以使用其功能。
  2. 在我们的代码中包含 std 命名空间,以便使用它的类而不调用它。
  3. 创建一个名为Num的类Generator.
  4. 使用私有访问修饰符来标记变量,我们即将创建为私有可访问的变量。
  5. 创建一个名为 nextNum 的静态整数变量。
  6. 使用公共访问修饰符可以帮助您将我们即将创建的变量标记为可公开访问的。
  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对象。