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

news2024/10/10 0:24:26

在这里插入图片描述

在这里插入图片描述

🌈个人主页: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++的实际应用和创新。🌐🔍

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【重学C语言】四、运算符和表达式

【重学C语言】四、运算符和表达式 概念左值与右值运算符一元运算符二元运算符三元运算符 优先级结合性 基本运算符赋值运算符算术运算符复合赋值运算符位运算符应用条件和逻辑运算符条件运算符逻辑运算符逻辑短路逻辑与&#xff08;&&&#xff09;的短路行为逻辑或&…

数学结论在dsa中的应用

1. LC 3102 最小化曼哈顿距离 VP周赛391 T4。这是个结论题目。 首先曼哈顿距离是需要两个数对而不是两个数去进行比较的&#xff0c;两个数之间你很轻易就知道差的绝对值最大是多少了&#xff0c;只要挑最大和最小两个数一减就可以了。 但是两个数对之间各项差的绝对值之和最…

了解以太坊虚拟机(EVM)

了解以太坊虚拟机&#xff08;EVM&#xff09; 以太坊虚拟机&#xff08;Ethereum Virtual Machine&#xff0c;简称EVM&#xff09;是以太坊网络的核心组件之一&#xff0c;它承担着智能合约执行的重要任务 特点 智能合约执行环境&#xff1a;EVM提供了一个安全的环境&#xf…

【C++STL详解 —— vector的介绍及使用】

【CSTL详解 —— vector的介绍及使用】 vector的介绍vector的使用vector的构造vector iterator 的使用begin和endrbegin和rend vector 空间增长问题size和capacityreserve和resizeempty vector 增删查改push_back和pop_backinsert和erasefindswap元素访问 vector 迭代器失效问题…

案例:非功能性需求的设计

在咨询中看到很多项目组对于非功能性需求没有做设计&#xff0c;很多项目组在设计文档中仅仅是把非功能性需求的描述拷贝到设计文档的非功能性章节。因此特地设计了两个简单的需求给大家参考&#xff0c;希望能够引导设计人员重视非功能性需求的设计。

软件设计师-案例分析2

文章目录 除09-1520上-结构化分析20上-数据库分析20上-面向对象分析与设计 除09-15 20上-结构化分析 问题1&#xff1a; 问题2&#xff1a; 问题3&#xff1a; 问题4&#xff1a; 回答1&#xff1a;E1检测设备&#xff1b; E2管理员&#xff1b;E3检测业务员&#xff1b;…

Java多态世界(day18)

多态&#xff1a;重写的方法调用和执行 1.静态绑定&#xff1a;编译器在父类中找方法&#xff0c;如&#xff1a; 上面的eat&#xff08;&#xff09;方法是先在父类中找方法&#xff0c;父类没有的话&#xff0c;就算子类有编译也会报错。&#xff08;如果引用方法在父类中存…

HashMap为啥线程不安全?

1. HashMap1.7在多线程并发下扩容时&#xff0c;头插法会出现环。 /*** Rehashes the contents of this map into a new array with a* larger capacity. This method is called automatically when the* number of keys in this map reaches its threshold.** If current cap…

使用Detours进行HOOK

文章目录 Detours介绍Detours配置Detours进行Sleep Hook Detours介绍 Detours是微软研究院开发的一款软件工具&#xff0c;用于Windows平台上的应用程序重定向和修改。 它可以在运行时修改应用程序的执行路径&#xff0c;允许开发人员注入自定义代码来改变应用程序的 行为&…

STM32 定时器外部时钟与循迹模块

1、上篇文章介绍了定时器使用内部时钟信号计数&#xff0c;实现计数、更新中断等功能。 2、可不可以利用定时器对来自外部的信号进行计数&#xff1f;也就是对输入io的信号计数&#xff1f; 3、可以 1、定时器外部时钟 STM32的通用定时器和高级定时器都将外部信号引入…

深入解析:链游、DApp、公链、NFT与交易所开发的全景图

随着数字货币和区块链技术的迅速发展&#xff0c;链游开发、DApp开发、公链开发、NFT开发以及交易所开发等领域吸引了越来越多的关注。本文将以3000字的篇幅&#xff0c;对这些领域进行详细解析&#xff0c;探讨它们的意义、应用场景以及未来发展趋势。 链游开发&#xff08;Bl…

每日面经分享(python进阶 part2)

Python中的装饰器和上下文管理器区别是什么&#xff1f;它们分别适用于哪些场景&#xff1f; a. 装饰器用于在函数或类的外部添加额外功能&#xff0c;而上下文管理器用于管理资源的获取和释放。 b. 装饰器是一种用于修改函数或类行为的技术。适用于需要在函数或类的外部添加额…

Electron 打包自定义NSIS脚本为安装向导增加自定义页面增加输入框

Electron 打包工具有很多&#xff0c;如Electron-build、 Electron Forge 等&#xff0c;这里使用Electron-build&#xff0c;而Electron-build使用了nsis组件来创建安装向导&#xff0c;默认情况nsis安装向导不能自定义安装向导界面&#xff0c;但是nsis提供了nsis脚本可以扩展…

YOLO火灾烟雾检测数据集:20000多张,yolo标注完整

YOLO火灾烟雾检测数据集&#xff1a;一共20859张图像&#xff0c;yolo标注完整&#xff0c;部分图像应用增强 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集或其他任何数据集请私信

kubadm部署kubernetes

什么是kubernetes Kubernetes是一款应用于集群的&#xff0c;容器自动部署、扩展和管理的开源平台&#xff0c;提供了一种以容器为中心的基础架构。利用kubernetes&#xff0c;你可以快速高效地响应客户如下请求&#xff1a; 应用程序的动态、精准部署应用程序的动态扩展无缝推…

vscode + wsl1 搭建远程C/C++开发环境

记录第一次搭建环境过程。 搭建C/C开发环境有很多种方式&#xff0c;如 MinGW vscode&#xff08;MinGW 是GCC的Windows版本&#xff0c;本地编译环境&#xff09;SSH隧道连接 vscode&#xff08;远程Linux主机&#xff09;wsl vscode&#xff08;远程Linux环境&#xff09…

第14章 数据结构与集合源码

一 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; 战场&#xff1a;程序运行所需的软件、硬件环境 战术和策略&#xff1a;数据结构 敌人&#xff1a;项目或模块的功能需求 指挥官&#xff1a;编写程序的程序员 士兵和装备&#xff1a;一行一行的代码 …

GPT4不限制使用次数了!GPT5即将推出了!

今天登录到ChatGPT Plus账户&#xff0c;出现了如下提示&#xff1a; 已经没有了数量和时间限制的提示。 更改前&#xff1a;每 3 小时限制 40 次&#xff08;团队计划为 100 次&#xff09;&#xff1b;更改后&#xff1a;可能会应用使用限制。 GPT-4放开限制 身边订阅了Ch…

C语言——字符串函数

一.前言 我们在日常写代码的过程中&#xff0c;经常会对字符串进行处理的过程。而在C语言中的<string.h>中&#xff0c;包含了众多字符串函数&#xff0c;我们可以借助这些字符串函数来对其进行各种操作。 二.strlen函数 strlen函数的作用是求出所传字符串的长度。该函…

图片改大小尺寸怎么改?几个修改图片尺寸的方法

日常生活和工作中&#xff0c;图片的大小和尺寸对于我们的工作和生活都至关重要&#xff0c;因此我们经常需要调整图片的大小。我们都知道压缩图是一款功能强大的图片在线处理工具&#xff0c;那么用它怎么调整图片大小呢&#xff1f;下面就让我们一起来看一下具体的操作步骤。…