在Visual C++中进行类设计的通行做法(下)——类的运行

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下在Visual C++中进行类设计的通行做法,这一篇帖子来看看在搭建好基本架构并调整好重复定义问题后,怎么个运行法。程序员新手会去看很多书,但是书中往往教语法多,讲程序员习惯的少。那我们就来谈谈这个话题。

我们再来看看我们前面在搭建好基本架构并调整好重复定义问题后,程序变成什么样子了,如下。

father.h代码如下所示。

#ifndef FATHER_H_H
#define FATHER_H_H
 
class Father
 
{
public:
  Father();
  ~Father();
  void eat();
  void run();
  virtual void study();
};
 
#endif

father.cpp代码如下所示。

//在源文件中包含类中成员函数的实现
#include "pch.h"
 
//因为在编译 father.cpp时,编译器不知道 father到底是什么,所以要包含father.h,这样,
//编译器就知道 father是一种类的类型
#include "father.h"
 
#include <iostream>
using namespace std;
 
//::叫作作用域标识符,用于指明一个函数属于哪个类或一个数据成员属于哪个类。::前面如果不跟
//类名,则表示是全局函数(即非成员函数)或全局数据
Father:: Father()
{
}
 
Father:: ~Father()
{
}
 
//注意:虽然我们在函数体中什么也没写,但仍然是实现了这个函数
void Father:: eat()
{
}
  
void Father:: run()
{
}
 
//注意,在头文件(.h文件)中加了virtual后,在源文件(.cpp文件)中就不必再加virtual了
void Father:: study()
{
  cout<<"study"<<endl;
}

son.h代码如下所示。

#include "father.h"
 
#ifndef SON_H_H
#define SON_H_H
 
class Son:public Father
{
public:
  void study ();
};
#endif

son.cpp代码如下所示。

#include "pch.h"
#include "son.h"
#include <iostream>
using namespace std;
 
void Son:: study ()
{
  cout<<"new study"<<endl;
}

study.cpp代码如下所示。

#include "pch.h"
#include "father.h"
#include "son.h"
 
void fn(Father *p)
{
  p->study ();
}
 
int main()
{
  Father *p;
  Son st;
  p=&st;
  fn(p);
  return 0;
}

我们在study这个项目中,选择菜单【生成】→【重新生成study】,重新编译所有的项目文件,可以看到如下输出:

1>-----已启动全部重新生成:项目:study,配置:Debug Win32-----
1>pch.cpp
1>father. cpp
1>study. cpp
1>son. cpp
1>正在生成代码...
1>study. vcxproj -> D:\VC\Debug\study.exe
===========全部重新生成:成功1个,失败0个,跳过0个===========

从这个输出中,我们可以看到可执行程序study.exe的产生经过了以下步骤:

首先,C++编译器对项目中的三个源文件 study.cpp、son.cpp、 father.cpp单独进行编译(Compiling..)。

在编译时,先由预处理器对预处理指令(#include、#define和#if)进行处理,在内存中输出翻译单元(一种临时文件)。

编译器接受预处理的输出,将源代码转换成包含机器语言指令的三个目标文件(扩展名为obj的文件):study.obj、son.obj、 father.obj。在study项目的Debug目录下,我们可以看到编译生成的obj文件。

注意,在编译过程中,头文件不参与编译。

然后是链接过程(正在生成代码.),链接器将目标文件和你所用到的C++类库文件(就是.lib文件,也就是C++的标准库函数标准类库)一起链接生成study.exe。


  

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

猜你喜欢

转载自blog.csdn.net/wang2015cn/article/details/131837012
今日推荐