【C++】关于关键字static和extern的详细用法

这几天把《C++程序设计》重新看了一遍,发现了好多自己以前没有注意的知识点,尤其时关于关键字static和extern的使用,让我有一种温故而知新的感觉!

【C++】关于关键字static和extern的详细用法_第1张图片


文章目录

    • 关于关键字static的使用
      • 一.在类外的使用
          • 1.和变量相关的使用
          • 2.和函数相关的使用
      • 二.在类内的使用
          • 1.和类数据成员相关的使用
          • 2.和类成员函数相关的使用
    • 关于关键字extern的使用
          • 1.和变量相关的使用
          • 2.和函数相关的使用

关于关键字static的使用

关于关键字static的使用场景有两种:

  1. 在类外的使用
  2. 在类内的使用

一.在类外的使用

在类外使用时可分为两种情况,分别如下:

1.和变量相关的使用

在定义变量的使用中有两种情形,分别如下:

  1. 静态局部变量
    当在函数内部定义了一个变量,并且希望下次函数调用时,该变量保留上一次函数调用结束时的值,这时就应该把这个变量定义为静态局部变量
    代码演示如下:
#include
using namespace std;
int ceshi()
{   //定义静态局部变量a
	static int a=0;
	a++;
	return a;
}

int main()
{
	for(int i=0;i<5;i++)
	{
		cout<<ceshi()<<endl;
		
		}
	return 0;
}

运行结果如下:
【C++】关于关键字static和extern的详细用法_第2张图片

对代码中局部静态变量a的值分析如下:

第几次调用 调用时初值 调用结束时的值
1 0 1
2 1 2
3 2 3
4 3 4
5 4 5
  1. 静态外部变量
    静态外部变量:通俗的的说就加了static关键字的外部变量,它只限于本文件使用,不能被其它文件调用。代码演示如下:
//file1.cpp
#include
using namespace std;
//在file1.cpp文件中定义静态外部变量a
static int a=3;
int main()
{
	.
	.
	.
}
//file2.cpp
#include
using namespace std;
//在file2.cpp中试图声明file1.cpp中定义的静态全局变量a
extern a;
int main()
{
	cout<<a<<endl;
}

分析:在file1.cpp中定义了一个静态外部变量a,因此它只能用于本文件,虽然在file2.cpp中使用了extern int a;声明a为其它文件中的外部变量,但是file2.cpp文件仍然无法使用file1.cpp中的全局变量a,因为其是静态的,只能供本文件调用。

2.和函数相关的使用

静态函数:在定义函数时在函数类型的前面加关键字static。

静态函数的使用和静态外部变量的使用相同,如果一个函数被声明为静态函数,则其只能供其所在文件的其它函数引用,而不能被外部文件中的函数引用。代码如下:

//file1.cpp
#include
using namespace std;
//在file1.cpp文件中定义了静态函数max()
static int max(int a,int b)
{
	int z;
	z=x>y?x:y;
	return z;
}
//file2.cpp
#include
using namespace std;
int main()
{   //试图声明file1.cpp文件中定义的静态外部函数max()为在其它文件中定义的外部函数
	extern int max(int,int);
	int a,b;
	cin>>a>>b;
	//调用max()函数
	cout<<max(a,b)<<endl;
	return 0;
}

分析:在file1.cpp文件中定义了静态函数max(),在file2.cpp文件中试图通过extern int max(int,int);将其max()函数声明为其它文件中的外部函数,不可以,因为静态函数只能被本文件调用。

二.在类内的使用

1.和类数据成员相关的使用
  • 静态数据成员
    在类中如果希望每个对象的某个数据成员的值都是一样的,就可以将其定义为静态数据成员,代码如下:
class Box
{
	public:
	static int height;
	int width;
	int length;	
}

分析:代码中的数据成员height被定义为静态的,它属于类,而不属于某个具体的对象。可以通过类名或者对象名对其进行引用。

2.和类成员函数相关的使用
  • 静态成员函数
    静态成员函数和静态数据成员一样都不属于某一个具体的对象,而是属于类的,它的主要功能是为了处理静态数据成员,定义静态成员函数的代码如下:
class Box
{
	private:
	static int height;
	int width;
	int length;	
	public:
	static int volume();
}

分析:静态类成员函数的定义,只需在成员函数的最前面冠以关键字extern即可。


关于关键字extern的使用

1.和变量相关的使用

在和变量相关的使用中可分为以下的两种情况:

  1. 在一个文件内声明全局变量
    如果一个外部变量不是在文件的开头定义,那么其的作用范围只限于变量定义的位置起到文件终了的位置止,如果想扩大变量的作用域,则可以在变量引用之前使用关键字extern对变量进行提前引用声明,如下:
    #include
    using namespace std:
    int main()
	{
		extern a,b;
	    cout<<a+b<<endl;
	    return 0;
    }
    int a=15,b=20;

分析:变量a,b定义在主函数的后面,如果想在主函数中使用变量a,b就需要使用关键字extern对变量a,b进行提前引用声明。

  1. 在多文件的程序中声明外部变量
    一个C++程序可以由一个或多个源文件组成,如果程序只由一个源文件组成,使用外部变量的方法前面已经介绍了,而在一个文件中如果想引用另一个文件中定义的非静态外部变量同样需用到extern关键字,如下:
//file1.cpp
#include
using namespace std;
//在file1.cpp文件中定义非静态外部变量a
int a=3;
int main()
{
	.
	.
	.
}
//file2.cpp
#include
using namespace std;
//在file2.cpp中声明file1.cpp中定义的非静态外部变量a
extern a;
int main()
{
	cout<<a<<endl;
}

分析:在file1.cpp中定义了一个非静态全局变量a,在file2.cpp中使用了extern int a;声明a,将file1.cpp中的变量a的作用域扩展到了file2.cpp文件中,在file2.cpp文件中也可以正常使用变量a。

2.和函数相关的使用

在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数时外部函数,可供其它文件调用。如下:

//file1.cpp
#include
using namespace std;
//在file1.cpp文件中定义了非静态外部函数max()
int max(int a,int b)
{
	int z;
	z=x>y?x:y;
	return z;
}
//file2.cpp
#include
using namespace std;
int main()
{   //声明函数max()为在其它文件中定义的外部函数
	extern int max(int,int);
	int a,b;
	cin>>a>>b;
	//调用max()函数
	cout<<max(a,b)<<endl;
	return 0;
}

分析:在file1.cpp文件中定义了非静态外部函数max(),在file2.cpp文件中通过extern int max(int,int);声明该函数是其它文件中的外部函数,并进行调用。

【C++】关于关键字static和extern的详细用法_第3张图片



关于关键字static和extern的讲解就到这里了,如果有帮助到各位的话记得点个赞加个关注噢!你们的赞力就是博主创作的动力!

你可能感兴趣的:(C++,c++,开发语言)