0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

汽车电子技术 来源:C语言Plus 作者:Maye426 2023-02-27 15:33 次阅读

前面我们学习了如何定义类,以及如何使用类的成员,在前面我们把成员函数都定义在了类的内部,接下来我们学习,如何把类的定义和成员函数的实现分离。

在面向对象的程序开发中,一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工作量,节省篇幅,提高编程的效率。

由于在头文件中包含了类的声明,因此在程序中就可以用该类来定义对象。由于在类体中包含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数。为了实现上一节所叙述的信息隐蔽,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中。例如,可以分别写两个文件:

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;
 }

为了组成一个完整的源程序,还应当有包括主函数的源文件:

#include"Student.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函数是怎么实现的(函数值是怎样计算出来的)。

当然,前提是系统已装了标准函数库。在用户源文件经过编译后,与系统库(是目标文件)相连接。在用户程序中包含类声明头文件,类声明头文件就成为用户使用类的公用接口,在头文件的类体中还提供了成员函数的函数原型声明,用户只有通过头文件才能使用有关的类。用户看得见和接触到的是这个头文件,任何要使用这个类的用户只需包含这个头文件即可。包含成员函数定义的文件就是类的实现。

请特别注意:类声明和函数定义一般是分别放在两个文本中的。由于要求接口与实现分离,为软件开发商向用户提供类库创造了很好的条件。

开发商把用户所需的各种类的声明按类放在不同的头文件中,同时对包含成员函数定义的源文件进行编译,得到成员函数定义的目标代码。软件商向用户提供这些头文件和类的实现的目标代码(不提供函数定义的源代码)。用户在使用类库中的类时,只需将有关头文件包含到自己的程序中,并且在编译后连接成员函数定义的目标代码即可。

由于类库的出现,用户可以像使用零件一样方便地使用在实践中积累的通用的或专用的类,这就大大减少了程序设计的工作量,有效地提高了工作效率。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内部
    +关注

    关注

    0

    文章

    9

    浏览量

    18839
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62409
  • 定义
    +关注

    关注

    0

    文章

    10

    浏览量

    14335
收藏 人收藏

    评论

    相关推荐

    强大的matlab:在中实现static成员变量 (转帖)

    。static成员函数在不创建对象的时候直接调用。很不幸的是MATLAB不支持static成员变量,只能定义static
    发表于 03-07 10:42

    为labview创建自定义探针

    通过自定义探针来访问需要访问的LabVIEW成员vi信息,废话不说直接写原理过程:1. 创建一个demo.Lvproj2. Write data为成员vi3.上图为main.vi4.
    发表于 03-22 10:32

    函数申明是int而不是void

    如下是定时中断的主函数,为什么函数申明是int,而不是void呢?没有返回值啊! int main(void){ Stm32_Clock_Init(9); //系统时钟设置 delay_init
    发表于 04-02 00:00

    vc的常用成员函数

    CRect:用来表示矩形的,拥有四个成员变量:top left bottom right。分别表是左上角和右下角的坐标。可以通过以下的方法构造:
    发表于 08-02 06:33

    成员函数中const的使用,有什么注意事项?

    成员函数中const的使用,有什么注意事项?
    发表于 04-26 06:42

    成员函数与普通函数的区别研究

    本文的目的是研究成员函数与普通函数之区别,以及不同调用方式之间的区别,进而通过内联汇编语句模仿特定的调用,从而完成通过普通函数指针调用
    发表于 09-15 14:52 32次下载

    内联函数详解

    什么是内联性和外联函数 成员函数可以分为内联函数和外联函数。内联
    发表于 11-02 14:05 0次下载

    如何在CAA中定义全局函数

    如果在编译时出现使用了未定义ExportedByGlobal的错误,是因为在全局函数所在的的头文件中没有包含Global.h,其中Global是全局
    发表于 04-03 14:24 8次下载

    的拷贝构造函数主要用途是什么?

    在实例化的时候会调用的缺省构造函数,在struct里,要定义一个同名函数指针指向一个具有构造函数
    的头像 发表于 06-24 14:28 4765次阅读

    EE-128:C++中的DSP:从C++调用汇编成员函数

    EE-128:C++中的DSP:从C++调用汇编成员函数
    发表于 04-16 17:04 2次下载
    EE-128:C++中的DSP:从C++调用汇编<b class='flag-5'>类</b><b class='flag-5'>成员</b><b class='flag-5'>函数</b>

    2.10 学生-构造函数 (15分)

    10 学生-构造函数 (15分)定义一个有关学生的Student,内含成员变量: Stri
    发表于 12-29 19:05 1次下载
    2.10 学生<b class='flag-5'>类</b>-构造<b class='flag-5'>函数</b> (15分)

    QObject中常使用的成员函数和重要宏定义

    每个对象都有一个objectName(),可以通过相应的metaObject()找到它的名(函数:QMetaObject::className())。在实际开发中可以使用inherits()函数确定对象的
    的头像 发表于 02-20 09:42 1311次阅读

    函数结构的定义和例程说明

    在理解拷贝构造函数前,还是有必要回顾下的构造函数基本概念。的构造函数是一种特殊的成员
    的头像 发表于 04-19 11:35 989次阅读

    C++11新的功能(特殊成员函数、override和final)

    C++11在原有的4个特殊成员函数(默认构造函数、复制构造函数、复制赋值运算符和析构函数)的基础上新增了移动构造
    的头像 发表于 07-18 16:02 469次阅读

    python定义函数与调用函数的顺序

    定义函数与调用函数的顺序 函数定义后,本身是不会自动执行的,只有在被调用后,函数才会被执行,得
    的头像 发表于 10-04 17:17 1267次阅读