C/C++教程

C++:static关键字——修饰变量、函数以及作为类成员详解

本文主要是介绍C++:static关键字——修饰变量、函数以及作为类成员详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

  • static修饰变量
  • static修饰函数
  • static在类中的使用
    • 类的静态变量
    • 类的静态函数

static修饰变量

  1. 如果 静态变量在函数外声明:
static int x = 10;
int fun() {}
int main() {}

这种变量在内存的 .data区,但作用域和可见性为本文件,即链接性为内部的,其他文件不可访问。

  1. 如果静态变量在函数内:
int fun(int a)
{
	static int x = a;
	x = a;
	return x;
}

对于这种情况,静态变量x 的作用域为fun()函数,但它仍然存储在.data区,生存期延长至程序结束。函数内第一条语句,是对x的初始化,不管函数执行多少次,初始化只有一次。

  1. 如果在一个文件中定义了一个全局变量,其具有外部链接性,在第二个文件中定义了一个同名的静态变量:
//file 1
int num = 10;
___________________________
//file 2
static int num = 20;
void fun()
{
	cout << num << endl;
}

此时,静态变量隐藏常规的外部变量,所以会打印 静态的变量。

static修饰函数

如果将函数定义为静态,和全局的静态变量一样,其可见性为本文件有效,同一个工程的其他文件不可用。
错误示例:

//file1
static int fun()
{
	//...
}
________________________
//file 2
int test()
{
	int x = fun(); //error
}

static在类中的使用

类的静态变量

设计一个静态变量作为类成员。
示例代码

class Object
{
private:
	int value;
	static int num;
public:
	Object(int x = 0) : value(x)
	{
		num += 1;
	}
	~Object()
	{
		num -= 1;
	}

	Object(const Object& obj) : value(obj.value)
	{
		num += 1;
	}
};
int Object::num = 0;

‘注意点:

  • 类的静态变量必须在类外初始化
  • 类的静态变量,所有该类的对象共用一份

示例:

int main(void)
{
	Object obja(10);
	Object objb(20);

	return 0;
}

在这里插入图片描述

根据监视器可以看出:

  • 两个对象的普通变量都是自己的,而静态变量num共用一份。
  • 在对象中并没有看到静态变量属于谁,这就意味着,无法通过this指针来约束静态变量。

示例:在刚才类的基础上加上一个常方法

void Print() const
{
	num += 10;
	cout << "value = " << this->value << "num = " << this->num << endl;
}
int main(void)
{
	Object obja(10);
	obja.Print();
	Object objb(20);
	objb.Print();
	return 0;
}

这样是可以编译通过的,可以看出对象模型里没有 num,所以即使使用const限制this指针,还是可以对 静态变量修改。
在这里插入图片描述

类的静态函数

示例:如果把非静态函数Print()的内容写成静态函数,那么还能编译通过吗?

static void Show()
{
	num += 10;
	cout << this->value << endl;
	cout << num << endl;
}

注意
静态函数和非静态函数最大的区别就是:
非静态函数有this指针,而静态函数没有this指针,所以若要输出 value,编译器会不知道输出谁的value,编译出错。
在这里插入图片描述

这篇关于C++:static关键字——修饰变量、函数以及作为类成员详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!