类的申明和成员函数定义分离是什么

前面我们学习了如何定义类,以及如何使用类的成员,在前面我们把成员函数都定义在了类的内部,接下来我们学习,如何把类的定义和成员函数的实现分离。
在面向对象的程序开发中,一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工作量,节省篇幅,提高编程的效率。
由于在头文件中包含了类的声明,因此在程序中就可以用该类来定义对象。由于在类体中包含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数。为了实现上一节所叙述的信息隐蔽,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中。例如,可以分别写两个文件:
student.h 这是头文件,在此文仅重进行类的声明
#pragma once #include #include #include #include using namespace std; class student { private: int id; int age; char name[10]; public: void init(int sid = 0, int sage = 0, const char* sname = null); void showstuinfo(); };student.cpp 这是源文件,类的所有函数都在此文件中实现
#include student.h void student::init(int sid, int sage, const char* sname) { id = sid; age = sage; strcpy(name, sname); } void student::showstuinfo() { cout << id << << age << << name << endl; }为了组成一个完整的源程序,还应当有包括主函数的源文件:
#includestudent.h//讲类声明头文件包含进来 int main(){ student cplus;//定义对象 cplus.init(111,20,c语言plus); cplus.showstuinfo(); return 0; }类的申明和成员函数定义分离注意问题
和写在里面一样,但是需要指定作用域,在外面的函数名前面加上类名,形如【类名::函数名】 :: 双冒号是作用域限定符如果函数参数有默认参数,那么声明和实现不能同时存在默认参数,建议保留声明中的默认参数,让用户看到如果一个student.h同时被多个文件调用,每次都要对包含成员函数定义的源文件(如上面的student.cpp)进行编译,这是否可以改进呢?的确,可以不必每次都对它重复进行编译,而只需编译一次即可。把第一次编译后所形成的目标文件保存起来,以后在需要时把它调出来直接与程序的目标文件相连接即可。这和使用函数库中的函数是类似的。这也是把成员函数的定义不放在头文件中的一个好处。(静态库,以后会讲)
在实际工作中,并不是将一个类声明做成一个头文件,而是将若干个常用的功能相近的类声明集中在一起,形成类库。类库有两种:
c++编译系统提供的标准类库;用户根据自己的需要做成的用户类库,提供给自己和自己授权的人使用,这称为自定义类库。在程序开发工作中,类库是很有用的,它可以减少用户自己对类和成员函数进行定义的工作量。
类库包括两个组成部分:
类声明头文件;已经过编译的成员函数的定义,它是目标文件。用户只需把类库装入到自己的计算机系统中(一般装到c++编译系统所在的子目录下),并在程序中用#include命令行将有关的类声明的头文件包含到程序中,就可以使用这些类和其中的成员函数,顺利地运行程序。这和在程序中使用c++系统提供的标准函数的方法是一样的,例如用户在调用sin函数时只需将包含声明此函数的头文件包含到程序中,即可调用该库函数,而不必了解sin函数是怎么实现的(函数值是怎样计算出来的)。
当然,前提是系统已装了标准函数库。在用户源文件经过编译后,与系统库(是目标文件)相连接。在用户程序中包含类声明头文件,类声明头文件就成为用户使用类的公用接口,在头文件的类体中还提供了成员函数的函数原型声明,用户只有通过头文件才能使用有关的类。用户看得见和接触到的是这个头文件,任何要使用这个类的用户只需包含这个头文件即可。包含成员函数定义的文件就是类的实现。
请特别注意:类声明和函数定义一般是分别放在两个文本中的。由于要求接口与实现分离,为软件开发商向用户提供类库创造了很好的条件。
开发商把用户所需的各种类的声明按类放在不同的头文件中,同时对包含成员函数定义的源文件进行编译,得到成员函数定义的目标代码。软件商向用户提供这些头文件和类的实现的目标代码(不提供函数定义的源代码)。用户在使用类库中的类时,只需将有关头文件包含到自己的程序中,并且在编译后连接成员函数定义的目标代码即可。
由于类库的出现,用户可以像使用零件一样方便地使用在实践中积累的通用的或专用的类,这就大大减少了程序设计的工作量,有效地提高了工作效率。

基于HA13118的18瓦音频放大器电路
高通正式推出了全球首个Qualcomm QTM527毫米波天线模组
“一石三鸟”固相烧结策略!废旧锂离子电池直接再生研究获进展
格莱美大师助阵 华为nova 2系列与暑期档大片更配
大幅面扫描仪技术术语:Gamut(色彩饱和度)
类的申明和成员函数定义分离是什么
速美达余衍兴《系统集成方案的优化之路》发表主题演讲
佳维视工业显示器在商场中的应用
网络需求面临挑战,如何赢得成功的SD-WAN伙伴关系?
华为重磅新机:华为Nova青春版真机曝光将于本月24日发布,华为新颜值担当!
智能家居不可或缺的 Smart Sensor 解决方案(一)
朝微电子:“以研带产”实现多项半导体器件国产化
让CPU更接近数据 Serverless成为计算存储的关键
蓬勃兴起的5G技术服务在抗击疫情中的作用日益显现
【大大速递】低功耗高精度,@4/11博世智能算法、嵌入式 AI 和 MEMS 传感器 – 物联网的无声推动者线上研讨会
高温熔体压力传感器原理_高温熔体压力传感器技术参数
华米AMAZFIT 智能运动手表支持支付宝付款 你敢绑定吗?
现在 - 真正的有效值到直流测量,从低频到2.5GHz
桥式吊机主钩电机主接触器的触点接触不良怎么办
怎么用模拟万用表来测定三极管的各个管脚?