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

news2024/10/7 18:29:29

我是荔园微风,作为一名在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深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装centos7 ping不通宿主机

1、安装Virbox虚拟机 2、安装centos 7镜像 主要有两点配置需要注意&#xff1a; A:磁盘分区 B:网络设置&#xff0c;今天的实验主要是卡在网络配置这里 网络设置&#xff0c;使用的是仅主机模式且是手动分配静态IP,要点说明 看宿主机所用的网络是哪个&#xff0c;查看window的…

OC时钟/BC时钟介绍、Windows/Linux环境查看时钟频率

一、OC时钟和BC时钟介绍 OC时钟和BC时钟是指计算机体系结构中的两种不同的时钟信号。 OC时钟&#xff08;Off-chip clock&#xff09;是指在计算机系统的主板或外部设备上产生的时钟信号&#xff0c;它通过总线传输到CPU中&#xff0c;控制着CPU与主板或外部设备之间的数据传…

Vue简介、生命周期、模版语法、条件渲染、列表渲染、style和class绑定

目录 简介 Vue基本渲染-插值和数据模型 MVVM 生命周期 模版语法 条件渲染 v-if ​编辑 v-show 列表渲染 key style绑定 class绑定 简介 Vue是一套用于构建用户界面的渐进式框架。与其他大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只…

Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

加载Ubuntu开发环境-iTOPRK3568开发板

配套视频&#xff1a; 安装虚拟机 ubuntu 系统&#xff1a;B站搜索北京迅为RK3568开发板 在 2.3 小节解压了迅为提供的 ubuntu 镜像&#xff0c;然后打开虚拟机&#xff0c;如下图所示&#xff1a; 点击上图中的红色框&#xff0c;选择在 2.3 小节中解压的 Ubuntu18 文件夹下…

oracle单个用户最大连接数限制

项目经理反馈&#xff0c;现场已做了单个用户的最大连接数2000的限制&#xff0c;但数据库还是报无法连接&#xff0c;故障用户的连接数已3800多了。 查看日志报错如下 2023-07-20T13:07:57.79465308:00 Process m000 submission failed with error 20 Process m000 submiss…

Matlab对FS32K144编程--串口通讯

1、配置系统运行周期10ms 2、设置串口通讯通道为通道1&#xff0c;波特率设为9600 3、设置串口发送-100ms发送一次 4、设置接收中断接收数据 5、编译下载&#xff0c;串口发送消息

go使用gin结合jwt做登录功能

1、安装gin go get -u github.com/gin-gonic/gin 2、安装session go get github.com/gin-contrib/sessions 3、安装JWT鉴权 go get "github.com/golang-jwt/jwt/v4" 4、创建一个jwt的工具文件 package utilsimport ("errors""github.com/golan…

共享汽车管理系统nodejs+vue

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端nodejsvueelementui, 共享汽车管理系统的系统管理员可以管理用户&#xff0c;可以对用户信息修改删除以及查询操作。具体界面的展…

JQ-3 jQuery事件处理(click和on的区别、事件冒泡、事件对象、事件委托、小案例); jQuery动画(常见动画函数、动画队列、小案例)

目录 1_ jQuery事件处理1.1_认识事件&#xff08;Event&#xff09;1.2_click和on的区别1.3_ jQuery的事件冒泡1.4_jQuery的事件对象( Event Object)1.5_ jQuery的事件委托&#xff08;event delegation&#xff09;1.6_ jQuery常见的事件1.7_小案例 2_ jQuery 动画2.1_介绍2.2…

【力扣每日一题】2023.7.23 接雨水

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 接雨水是力扣里非常经典的一道单调栈的题目&#xff0c;使用单调栈的做法就是从左到右将高度依次入栈&#xff0c;保持栈内从栈顶…

《零基础入门学习Python》第060讲:论一只爬虫的自我修养8:正则表达式4

有了前面几节课的准备&#xff0c;我们这一次终于可以真刀真枪的干一场大的了&#xff0c;但是呢&#xff0c;在进行实战之前&#xff0c;我们还要讲讲正则表达式的实用方法和扩展语法&#xff0c;然后再来实战&#xff0c;大家多把持一会啊。 我们先来翻一下文档&#xff1a;…

【iOS安全】iOS 14.3越狱教程

iOS 14.3越狱教程 通过MacBook越狱iPhone 8 方案&#xff1a;AltStore unc0ver 实验环境 手机&#xff1a;iPhone 8 OS版本&#xff1a;iOS 14.3 型号号码&#xff1a;A1863 PC型号&#xff1a;MacBook 实验步骤 Mac安装AltServer https://altstore.io/ 解压后启动 …

【ES】---ES的聚合(aggregations)

目录 一、前言1、聚合分类2、聚合的实现方式二、RestAPI--bucket聚合案例11、按照类型分bucket2、按照(String)时间分bucket三、RestAPI-- metric聚合案例11、metric指标统计四、RestAPI-- pipeline聚合案例1一、前言 聚合是对文档数据的统计、分析、计算。 注意:参与聚合的字…

Clion开发STM32之W5500系列(NTP服务封装)

概述 在w5500基础库中进行封装&#xff0c;获取服务端的时间&#xff0c;来校准本地时间。本次使用的方案是通过ntp获取时间定时器更新保证时间准确。 NTP封装 头文件 /*******************************************************************************Copyright (c) [sc…

【动态规划part03】| 343.整数拆分、96.不同的二叉搜索树

目录 &#x1f388;LeetCode343.整数拆分 &#x1f388; LeetCode96.不同的二叉搜索树 &#x1f388;LeetCode343.整数拆分 链接&#xff1a;343.整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些…

S32K1xx SDK(版本:S32_SDK_S32K1xx_RTM_4.0.3 )详细介绍

前言 在学习一款MCU之前&#xff0c;一般我的习惯是先下载官方提供的SDK包进行学习。然后学习了解SDK提供的资源、框架、以及各目录结构文件作用等&#xff0c;下面边学边做笔记记录。 S32K1系列SDK我们可以到下面的NXP官网去获取&#xff1a; https://www.nxp.com.cn/design…

数据库备份还原-mysqldump、mydumper、xtrabackup、压缩

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 一、创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARC…

Windows bat 查找文件被哪个进程占用,并终止该进程

一、背景 我有个批处理脚本如下&#xff1a; echo off chcp 936 & cls cd /D F:\Chen\python3\ExciseC set fdate%date:~0,4%%date:~5,2%%date:~8,2% python main.py >> crawl_record_%fdate%.log 2>&1 for /F %%f in (dir crawl_record_*.log /B ^| find /…

关于Swift中闭包和OC中block对局部变量基本数据类型值的捕获

翻了很多文章&#xff0c;发现关于Swift闭包关于上下文变量捕获这块&#xff0c;都没有说的很详细&#xff0c;或者Swift2这样的老版本已经不适用了&#xff0c;问了GPT也是和自己实验的结果不一样&#xff0c;记录下来。 一&#xff1a;OC的block 首先&#xff0c;回顾一下O…