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

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:bestdzik
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:针对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.
  【通联编辑:王力】
其他文献
摘 要: 在多项式神经网络训练算法中,当采用智能优化算法进行学习优化时,智能优化算法的控制参数对学习效果有很大影响,针对这一问题,本文提出了一种多项式神经网络的智能优化方法,其的控制参数是通过对单形领域的完全随机搜索来使用的,且粒子的多样性是通过种群的多特征状态来维持的,以避免算法陷入局部最优解,试验结果表明,该算法训练的神经网络不仅能有效提高识别率,而且能减小控制参数对学习性能的影响,提高算法的
摘要:LAMOST(郭守敬望远镜)提供了大量的天文光谱数据,而天体分类是天文学中得到广泛关注的问题,由于天体数量大,数据维度高,如何使用机器学习的方法对光谱进行处理,成为近些年的热点。针对天体分类问题,提出了HSODM(High-dimensional Spectral with Outlier Data Mining),这是一种改进的高维离群数据识别方法,其采用无监督学習方式,基于随机距离将大量
摘要:本文针对单目标多径跟踪问题提出了一种基于粒子滤波的多径伯努利跟踪算法。该算法首先利用多徑伯努利滤波算法解决了超视距雷达系统中的多径传播问题,然后结合粒子滤波实现方式解决了系统模型非线性问题。仿真实验表明该算法比传统的高斯混合多径伯努利滤波具有更高的跟踪精度。  关键词:粒子滤波;伯努利滤波;目标跟踪  1引言  目标跟踪即为利用传感器获得的参数对目标位置信息进行估计的过程,根据目标个数的不同
目标检测作为计算机视觉领域研究的重点之一,被广泛应用于自动驾驶、视频监控、医疗等领域。为了解决传统目标检测在实际应用过程中检测速度过慢以及检测精度不高等问题,本文提出一种改进的YOLO v3算法。首先,对于先验框位置使用K-means++算法进行提取,加快收敛速度;在YOLO v3特征提取部分引入SPP模块,实现局部特征和全局特征的融合,丰富特征图的最终表达能力;实验结果表明,改进后的YOLO v
摘要:目前物联网技术正在迅速的发展,智慧校园中基于物联网网络基础架构环境开始广泛搭建,但基于教室教学物联网终端仍然没有普及。智慧学生桌椅是在智慧教室中日常学生桌子和椅子加入物联网技术、传感器技术、语音识别技术、有线传输技术和无线传输技术等,收集学生在教室里的统计数据。利用大数据手段分析学生上课的行为、性格和心理。该技术作为辅助教学手段的工具,根据学生的不同类型,通过语音方式播放对其感兴趣的话题,开
近几年,环境污染依然是人们非常关注的话题,而生活垃圾的快速收集处理,能够有效地减少环境的污染。因此,智能垃圾收集机器人的研究与发展是非常必要的,它可以代替人们完成大量垃圾收集的工作。基于此,研究了一种YOLOv5s目标检测算法,先对目标进行合理的标注,接着进行有效的算法训练,然后算法测试,最后得到目标检测算法的模型,进而可以快速检测识别目标。
卷积神经网络作为深度学习领域近年来最优秀的算法之一,已经广泛应用于各种计算机视觉任务,尤其在图像分类任务中,卷积神经网络凭借其极高的分类准确率,使用率已经远超过传统的机器学习算法。街道字符识别作为图像分类任务的一种,为了完成这个分类任务,全文基于卷积神经网络技术,首先对数据集进行读取、并针对数据量较少问题,采取一系列的数据增强操作,然后完成卷积神经网络模型的构造。通过对模型的训练,测试结果显示测试
摘要:针对传统BP算法训练深度学习模型易受模型初始参数影响,训练效率较低的问题,基于遗传算法进行优化,提出了遗传优化分布式BP算法。首先,分析了BP算法和遗传算法的基本原理。然后,结合分布式训练的特点,提出了遗传优化分布式BP算法,确定了训练策略。最后,对遗传优化分布式BP算法和传统BP算法的训练效率进行了对比实验分析。结果表明,遗传优化分布式BP算法不受模型初始参数的影响,相对传统BP算法实现了
基于卷积神经网络在手写数字识别上的应用,对卷积神经网络模型进行介绍。本实验使用python编程语言在Keras上搭建模型,并对模型进行训练。实验数据集为MNIST。模型训练完毕后,对准确率进行评估。最后对测试数据进行预测以及利用混淆矩阵对哪些数字准确率较高和哪些数字容易混淆进行评估。