《C++程序设计》阅读笔记【2-程序结构】

在这里插入图片描述

在这里插入图片描述

🌈个人主页:godspeed_lucip
🔥 系列专栏:《C++程序设计》阅读笔记

本文对应的PDF源文件请关注微信公众号程序员刘同学,回复C++程序设计获取下载链接。


  • 1 程序结构
    • 1.1 外部存储类型
    • 1.2 静态存储类型
      • 1.2.1 静态全局变量
      • 1.2.2 静态函数
    • 1.3 作用域
      • 1.3.1 局部作用域
      • 1.3.2 函数作用域
      • 1.3.3 函数原型作用域
      • 1.3.4 命名空间作用域
      • 1.3.5 文件作用域
    • 1.4 生命期
      • 1.4.1 静态生命期
      • 1.4.2 局部生命期
      • 1.4.3 动态生命期
    • 1.5 多文件结构
    • 1.6 编译预处理
      • 1.6.1 #include指令
      • 1.6.2 #define(宏定义)指令
      • 1.6.3 条件编译指令
  • 2 总结


1 程序结构

1.1 外部存储类型

extern 关键字用于声明一个全局变量或函数,指示该变量或函数是在其他源文件中定义的,而不是当前文件中。主要的作用是告诉编译器在其他地方有该变量或函数的定义,从而防止出现重复定义错误。

注意:下面的示例中变量都是全局的。因此a在链接时,会发生两个地方都定义了a(多次定义)。假如file2.cpp中是extern int b,就不会报错。而由于两个文件中都是extern int c,都表示有一个int c在另外一个文件中,但是两个文件中都没有。因此会报错。

image-20240228100309026

1.2 静态存储类型

1.2.1 静态全局变量

在全局变量前加一个 static,使该变量只在这个源文件中可用,称之为全局静态变量。(全局变量是所有文件都可以共享的)
全局静态变量就是静态全局变量

注意:

假设file1.cpp中有extern int c。且file2.cpp中有static int c。那么在链接时会报错,因为static int c是只可以供file2.cpp独享的

1.2.2 静态函数

函数的声明和定义默认情况下在整个程序中是外部(extern)的。

有时候,我们可能需要使某个函数只在一个源文件中有效,不能被其他源文件所用,这时在函数前面加上 static。

inline函数默认是static类型

1.3 作用域

1.3.1 局部作用域

稍微注意一下下面这两个例子:

image-20240228102424203

image-20240228102528024

特别关注一个例子:

注意a虽然是形式参数,在函数的开头,但是它是局部作用域,而不是函数作用域

image-20240316210217290

1.3.2 函数作用域

即使一个局部变量被定义在函数的开头,这个局部变量也不会具有函数作用域。(准确来说,应该是这个局部变量具有一个从函数开头到函数结尾的块作用域)。

标号是唯一具有函数作用域的标识符(一般有goto语句使用)

image-20240228110255787

1.3.3 函数原型作用域

在定义函数原型时,编译器只关心参数的类型,并不关心参数的名字

image-20240316210059933

1.3.4 命名空间作用域

•例

namespace SomeNs {

	class SomeClass { ... };

}
SomeNs::SomeClass obj1;

using语句有两种形式:

  • using 命名空间名::标识符名;

  • using namespace 命名空间名;

特殊的命名空间

  • 全局命名空间:默认的命名空间(也就是说,当我们创建的变量、函数、类等不指定命名空间,那么它们就属于全局命名空间)

  • 匿名命名空间:对每个源文件是唯一的。也就是不写出命名空间的名字

1.3.5 文件作用域

解释:就是整个cpp文件都可以用的。全局标识符的作用域是文件作用域(包括全局变量和静态全局变量)

头文件中包含的标识符的作用域也是文件作用域(#include<iostream>

1.4 生命期

1.4.1 静态生命期

这种生命期与程序的运行期相同,只要程序一开始运行,这种生命期的变量就存在。只有在整个程序结束时,它才会被释放。

全局变量、静态全局变量、静态局部变量都具有静态生命期。

注意:静态局部变量只对定义它的函数始终有效。静态全局变量对整个文件中的函数都有效

注意:静态局部变量是局部作用域,但是具有静态生命期

1.4.2 局部生命期

一般都是局部变量的生命期。所有具有局部生命期的变量都存储在栈区

1.4.3 动态生命期

存储在内存堆区。

一般使用malloc和new创建,并使用free何delete释放

手动创建、手动释放

1.5 多文件结构

多文件结构中,C++项目运行的示意图:

image-20240228124905496

1.6 编译预处理

1.6.1 #include指令

#include<文件名>

这种格式用于嵌人 C++提供的头文件。这些头文件一般存于 C++系统目录中的include 子目录下。C++预处理器遇到这条指令后,就到 include 子目录下搜索给出的文件。并把它嵌入到当前文件中。这种方式是标准方式,

#nclude "文件名"

预处理器遇到这种格式的包含指令后,首先在当前文件所在目录中进行搜索,如果找不到,再按标准方式进行搜索。这种方式适合于规定用户自己建立的头文件

1.6.2 #define(宏定义)指令

基本上没有啥用了

1.6.3 条件编译指令

作用:一个源文件可能包含其中的几个头文件,这样会使得编译给出“一个符号重复定义多次”的错误。这时,需要在每个头文件中使用条件编译指令。

#ifdef DEBUG
    // 只在定义了 DEBUG 宏时编译这部分代码
    // 例如:gcc -DDEBUG myprogram.c
#endif

#ifndef NDEBUG
    // 只在没有定义 NDEBUG 宏时编译这部分代码
#endif

#if defined(WIN32) || defined(_WIN32)
    // 只在在Windows平台下编译这部分代码
#endif

2 总结

C++,犹如编程的交响乐, 在代码的海洋中奏响和谐的旋律。

它是创造者的笔,雕刻着无尽可能,

是思想的翅膀,让梦想飞翔的天空。

无拘无束,灵活多变。

C++,是程序员心中的宝藏,永不凋零的花朵。

渴望挑战C++的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多C++的奇迹吧。我们推出了引领趋势的💻C++专栏:《C++程序设计》阅读笔记,旨在深度探索C++的实际应用和创新。🌐🔍

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之外观(门面)模式

概念&#xff1a;要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口&#xff0c;使得子系统更易使用。 外观模式注重“统一的对象”&#xff0c;即提供一个访问子系统的接口&#xff0c;只有通过该接口&#xff08;Facade&#xf…

TCP的十个重要的机制

注&#xff1a;TCP不是只有十个机制 TCP 可靠传输是tcp最为重要的核心&#xff08;初心&#xff09; 可靠传输&#xff0c;并不是发送方把数据能够100%的传输给接收方 而是退而求其次 让发送方发送出去数据之后&#xff0c;能够知道接收方是否收到数据。 一但发现对方没有…

IPSec VPN 高级应用

IPSec的隧道嵌套 公网上架设多层隧道&#xff0c;整合不同隧道的优点&#xff0c;弥补缺点 1、GRE over IPSec VPN 1&#xff09;特点 通过GRE隧道运行的路由协议、组播等功能 通过IPSec提供数据的机密性、完整性检查、源认证 IPSec是保护GRE上面的所有流量&#xff08;动…

MIT6.828实验windows10下环境配置

根据6.1810提供的方法安装环境 实验地址 微软文档 一、安装 Windows Terminal https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701 二、安装WSL2 参考源&#xff1a;tommickey的博客园 启动Windows 子系统 1、 手动开启 打开「控制面板」&#xff…

可以写网易云的了!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 1枚程序媛&#xff0c;大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 259篇原创内容-gzh 后台回复“前端工具”可获取开发工具&#xff0c;持续更新中…

2024-HW --->SSRF

这不是马上准备就要护网了嘛&#xff0c;如火如荼的报名ing&#xff01;&#xff01;&#xff01;那么小编就来查缺补漏一下以前的web漏洞&#xff0c;也顺便去收录一波poc&#xff01;&#xff01;&#xff01;&#xff01; 今天讲的主人公呢就是SSRF&#xff0c;以前学的时候…

【leetcode C++】滑动窗口

1. LCR 008. 长度最小的子数组 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 题目…

如何自动申请免费的HTTPS证书?

在购买域名的时候我相信很多人都遇到了对于证书的问题&#xff0c;之前我也是使用阿里云的免费一年的证书&#xff0c;那时候感觉还好&#xff0c;一年更换一次&#xff0c;但是近期阿里云对于证书的过期时间直接砍到了三个月&#xff01;让我难以接受&#xff0c;所以我在想吧…

WPF中动画教程(DoubleAnimation的基本使用)

实现效果 今天以一个交互式小球的例子跟大家分享一下wpf动画中DoubleAnimation的基本使用。该小球会移动到我们鼠标左键或右键点击的地方。 该示例的实现效果如下所示&#xff1a; 页面设计 xaml如下所示&#xff1a; <Window x:Class"AnimationDemo.MainWindow&qu…

Harbor私有镜像仓库搭建

一、介绍 Docker容器应用的开发和运行路不开可靠的镜像管理&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署我们私有环境的Registry也是非常必要的。 Harbor是由VMware公司开源的企业级的Docker Registry管理项目&a…

面试算法-139-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…

STM32单片机智能电表交流电压电流程序设计(电流 电压互感器TV1005M+TA1005M)

资料下载地址&#xff1a;STM32单片机智能电表交流电压电流程序设计(电流 电压互感器TV1005MTA1005M) 1、摘要 5、基于STM32F103单片机智能电表交流电压电流设计 本设计由STM32单片机核心板电路交流电压电流检测模块电路WIFI模块电路指示灯电路组成。 1、通过电压互感器TV100…

C++模板实参推断

模板实参推断 我们已经看到&#xff0c;对于函数模板&#xff0c;编译器利用调用中的函数实参来确定其模板参数。 从函数实参来确定模板实参的过程被称为模板实参推断。 也就是说&#xff0c;只有函数参数才配有模板实参推断&#xff0c;函数返回类型是不配有的 在模板实参…

DNS搭建

DNS搭建 一、DNS简介 1、概念 DNS&#xff08;Domain Name System&#xff09;是一种分布式的命名系统&#xff0c;用于将域名与其对应的IP地址相互映射。简单来说&#xff0c;DNS充当了互联网上的“电话簿”&#xff0c;帮助用户通过易于记忆的域名查找到相应的网络资源&am…

调用飞书获取用户Id接口成功,但是没有返回相应数据

原因&#xff1a; 该自建应用没有开放相应的数据权限。 解决办法&#xff1a; 在此处配置即可。

Python打包exe文件——pyinstaller模块

Python打包exe文件——pyinstaller模块 目录 Python打包exe文件——pyinstaller模块介绍安装打包文件夹模式打包单文件模式方式SPEC打包(推荐) 介绍 当要在没有python环境的设备上运行python文件时就可以将环境变量全部封装成exe文件发送给对方&#xff0c;此时就可以使用打包…

使用Python实现基本的线性回归模型

线性回归是一种简单而强大的统计学方法&#xff0c;用于预测一个因变量与一个或多个自变量之间的关系。在本文中&#xff0c;我们将使用Python来实现一个基本的线性回归模型&#xff0c;并介绍其原理和实现过程。加粗样式 什么是线性回归&#xff1f; 线性回归是一种用于建立…

upload-labs训练平台

GitHub&#xff1a;GitHub - Tj1ngwe1/upload-labs: 一个帮你总结所有类型的上传漏洞的靶场 把下好的文件夹之间拖入到小皮的WWW目录下就可以之间访问网址使用了 目录 Pass-01(前端JS的绕过) (1)抓包绕过 (2)在前端绕过 Pass-02&#xff08;content-type绕过&#xff09;…

kettle快速入门教程

探索数据的深邃奥秘&#xff0c;引领你踏入数据处理的殿堂&#xff01;Kettle&#xff08;Pentaho Data Integration&#xff09;的神奇魔力&#xff0c;将为你解锁数据世界的无限可能。本人基于公司业务实战整理的50篇精华Kettle系列文章&#xff0c;是你的密钥&#xff0c;让…

【大模型应用篇2】提示词实践-短剧文案

在上节课《【大模型应用篇1】学会对模型念咒语》带大家一起学习了提示词工程&#xff0c;我相信大部分朋友学完之后&#xff0c;还是有懵懂的&#xff0c;这节课带大家实操一下提示词的应用场景&#xff0c;现在短剧的创作很火&#xff0c;好看的短剧内容一定不会差&#xff0c…