C++中静态成员应用方法的探讨

2021-09-23 04:29张艺涛沈木子方欢
电脑知识与技术 2021年24期
关键词:语言

张艺涛 沈木子 方欢

摘要:针对C++中静态数据成员在多文件编译环境中存在的问题,该文深入分析了 C++语言中类静态数据成员的声明和访问方法,定位利用全局变量来实现多文件编译的弊端,利用extern关键字修饰变量来实现多文件编译的思路,并详细阐述多文件编译中extern的用法,并举了相应的例子来进行例证。

关键词:C++语言;静态成员;static;extern;多文件编译

1 引言

静态数据成员用static修饰的数据成员具有静态生存期,可供函数来调用该全局变量完成一定需要,可应用局部变量或应用于类中的成员变量。static修饰全局变量,局部变量,函数,作用范围在同一文件内。extern修饰变量的声明以及函数的声明,作用范围在本文件及多文件范围。两者的声明、定义、存储却是不同的。

一个类中声明一个私有数据成员并以static修饰,在类外使用类名限定对该成员进行定义和初始化,实现该变量具有静态生存期,以及static修饰函数成员。在多文件编译下,类中staitc修饰的变量,编译器是无法识别。针对这一问题,本文提出使用extern关键字,用于静态数据成员的多文件编译,并对静态数据成员的定义和调用等问题进行了总结。

2 存在的问题

以一段程序关于点位置的移动来说明,如图1所示,采用多文件方法将原本的程序分为三部分,其中Point.h文件中声明一个类,以及类中的无参、有参构造函数、拷贝构造函数、析构函数、普通函数和一些数据成员;这些类的成员函数在Point.cpp中进行定义和初始化,其中static修饰的类中变量,用类名限制并进行初始化。在static修飾的数据成员用于多文件时,在编译过程中会出现各种错误如图2所示。

3 问题探索

从图2可以看出,编译该段代码过程中,在Point.cpp文件中出现各种错误,在确定代码准确无误的情况下,发现问题可能在static修饰的函数以及数据成员。原程序中的static修饰的count去除,仅剩static修饰的函数,编译代码并运行,代码运行正常。

问题转向static修饰的私有变量。

类的静态成员在类定义之外再加以定义,编译器是否无法找到为它们专门分配的空间呢?在类中直接对其赋值并以const进行修饰。const修饰的量是常量,无法对其再赋值,将该代码所有有关count的代码都删去,在另一编译文件引用count,并输出该值。代码如下:

在图5中Point类中声明一个extern变量,会发现编译出现问题count的指定存储类别,说明当声明一个类的时候并无extern变量的存储空间,而在源文件中对于extern只是声明,编译器没有实际意义上的赋予存储空间,只有在定义后,编译器在此标记存储空间在执行时加载内并初始化,间接说明extern修饰的变量无法在类中使用。extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时,在其他模块中寻找在其定义全局变量在外部使用声明时,extern关键字是必须的,如果变量没有extern修饰且没有显式的初始化,同样成为变量的定义,因此此时必须加extern,而编译器在此标记存储空间在执行时加载内并初始化为0。而局部变量的声明不能有extern的修饰,且局部变量在运行时才在堆栈部分分配内存。全局变量或函数本质上讲没有区别,函数名是指向函数二进制块开头处的指针。而全局变量是在函数外部声明的变量。函数名也在函数外,因此函数也是全局的。声明可以是多次,但是定义只能是一次,否则编译器会出错。extern int i;为声明,不是定义。int;既是声明也是义。使用externa 来声明一个数组时,extern char p[];定义于 .h文件.当用指针extern char *p;声明在.h文件中是错误的。将会导致系统崩溃。p在这里被声明为extern char* p ,而它原来的定义却char p[10].这种情况,当用p[i]这种形式提取这个声明的内容时,实际上得到的是一个字符。但按照上面的方法,编译器却把它当成是一个指针,把ASCII字符解释成为地址显然出错,如果此时程序无意义,不会污染空间内容。否则,会污染程序地址空间的内容,并出现莫名其妙的错误。

5 总结

对比static以及extern关键字,阐明两者相同与区别,同时发现static关键字在多文件编译单元的弊端,使用关键字extern解决多文件编译问题,最后总结extern用法。此次实验不仅是static以及extern的用法说明,更是在代码繁多情况下,多文件来编译使编写代码区块分工明确。当代码的内容变得复杂,既不会使程序员混淆,同时也能更好地完成任务。

参考文献:

[1] 赵娟.C++语言中共享机制的实现[J].电脑知识与技术,2019,15(4):212-213.

[2] 张永,方安仁,刘治生.C++语言中静态数据成员的研究[J].陕西理工学院学报:自然科学版,2005,21(4):22-24.

[3] 聂丰英.浅谈静态成员在C++中的应用[J].硅谷, 2008(17):27-27.

[4] 郑莉.C++语言程序设计[M].4版.北京:清华大学出版社,2012.

【通联编辑:王力】

猜你喜欢
语言
(n,k)-语言及左-(n,k)-语言的一些性质
语言的魅力
让语言描写摇曳多姿
多向度交往对语言磨蚀的补正之道
累积动态分析下的同声传译语言压缩
日常语言与播音语言
语言技能退化与语言濒危
论语言的“得体”
语言的将来
有趣的语言