【阅读笔记】c++ Primer Plus——第九章

news2024/9/24 9:17:17

内存模型和命名空间

单独编译

  • c++程序分成三部分
    • 第一部分:包含结构声明和使用这些结构的函数原型(头文件)
    • 第二部分:包含与结构有关的函数代码(源代码文件)
    • 第三部分:包含调用与结构相关的函数代码(源代码文件)
    • 头文件包含了用户定义类型的定义;源代码文件包含操纵用户定义类型的函数代码
  • 头文件中包含的内容:
    • 函数原型
    • #define 或 const 定义的符号常量
    • 结构声明
    • 类声明
    • 模板声明
    • 内联函数
  • 将这些内容放在头文件中,并不会创建变量,而会在源代码声明的时候,告诉编译器如何创建该变量
    头文件中,include使用""和<>的区别是:

    • 使用<>,c++编译器会在存储标准头文件的主机系统的文件系统中进行查找
    • 使用"",c++编译器会首先查找当前工作目录和源代码目录的文件时
  • 在调用头文件的时候,可能会出现头文件包含多次的情况,尤其是项目较为庞大的时候。可以通过使用#ifndef和#endif来避免该变量是否被定义。若COORDIN_H_被定义了,就会跳到endif后面

#ifndef COORDIN_H_
#define COORDIN_H_
struct polar
{
    double distance;
    double angle;
}
# endif

存储持续性、作用域和链接性

  • c++的4种存储方式:

    • 自动存储持续性(局部变量)
    • 静态存储持续性(static)
    • 线程存储持续性(thread_local,生命周期和所属线程一样长)
    • 动态存储持续性(new delete)
  • 作用域和链接

    • 作用域描述了名称在文件的多大范围可见
    • 链接性描述了名称如何在不同单元间共享。链接性为外部的名称可在文件间共享,链接性在内部的名称只能有一个文件中的函数共享

自动存储持续性

  • 默认情况下,函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性
int i = 5;
cout << &i << endl;
{
    cout << "测试" <<endl;
    int i = 2;
    cout << i << endl;
    cout << &i << endl;
    cout << "出来了" << endl;
}
cout << i <<endl;
cout << &i << endl;
cout << i <<endl;

*  这不得来个图

静态持续变量

  • 在c++中,为静态存储持续性变量提供了三种链接性 1. 外部链接性,可在其他文件中访问 2. 内部链接性,只能在当前文件中访问 3. 无连接性,只能在当前函数或代码块中访问
    与自动变量相比,寿命更长
int global = 100;       //第一种
static int test = 50;   //第二种
int main()
{
    ...
    retrn 0;
}
void func1(int n)
{
    static int count = 0 ;  //第三种
    ...
}

全局变量

  • 链接性为外部的变量简称为外部变量(全局变量),存储持续性为静态,作用域为整个文件。外部变量在函数外部定义,可以在main()前面或头文件中定义它们。定义了之后可以在后面的任何函数当中去使用
  • 每个使用外部变量的文件都必须声明它。服从"单定义规则"(变量只能有一次定义)
    • 定义声明,给变量分配存储空间
    • 引用声明,不分配存储空间,直接引用已有的变量(关键字extern)
    • "单定义规则"指的是每个变量只能定义一次,而不是不能有同名变量。若局部变量中存在和全局变量同名的变量,全局变量会被隐藏掉

staic变量

  • 将static限定符用于作用域为整个文件的变量时,该变量的链接性为内部。只能在所属文件中使用。使用static的静态变量,就不必担心其名称与其他文件中的全局变量发生冲突

静态存储性持续性、无链接性

将static限定符用于代码中定义的变量。在代码块中使用static,将导致局部变量的存储持续性为静态。意味着该变量只能在代码块中使用,但在代码块不处于活动状态是仍然存在

void test(int i);

int main()
{
    test(6);
    test(8);
}

void test(int i)
{
    static int result = 0;
    result = result + i;
    cout << result << endl;
}
  • 说明符和限定符
    • c++关键字分为存储说明符和cv-限定符
    • 存储说明符
      • auto
      • static
      • register
      • extern
      • thread_local
      • mutable
    • cv-限定符
      • const
      • volatile
  • 函数和链接性
    • c++不允许在一个函数中定义另外一个函数,因此所有的函数的存储性都默认为静态。同样可以使用static将函数的链接性设置为内部。必须同时在原型和函数定义中都加上static

名称空间

传统的c++名称空间

  • 声明区域是可以在其中进行声明的区域
  • 潜在作用域。变量的潜在作用域从声明点开始到其声明区域的结尾
  • c++对全部变量和局部变量的规则定义了一种名称空间层次,每个声明区域都可以声明名称,这些名称独立于其他声明区域中的声明名称。防止同名变量在不同函数中发生冲突的情况

新的名称空间特性

  • 通过定义一种新的声明区域来创建命名的声明空间(namespace)

  • 一个名称空间中的名称不会与另一个名称空降的同名变量发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西
    using声明和using编译指令。using声明使特定的标识符可用,using编译指令使整个名称空间可用

    • using编译指令由名称空间名和它前面的关键字using namespace组成
      using编译指令和using声明比较

    • using声明,像是声明了相应的名称。如果某个名称已经在函数中声明了,则不能用using声明导入相同的名称

    • using编译指令,将进行名称解析,像是包含了using声明和名称空间本身的最小声明区域中声明了名称一样

    • 如果using编译指令导入一个已经在函数中声明的名称,则局部名称将隐藏名称空间名,就像隐藏同名全局变量一样

  • 一般情况下,使用using声明比使用using编译指令更安全。因为using声明只导入指定名称,如果该名称与局部名称发生冲突,编译器会发出指示。using编译指令导入所有名称,包括并不需要的名称,如果和局部名称发生冲突,会被局部名称覆盖掉名称空间版本,但编译器并不会发出警告
    可以将名称空间声明进行嵌套

namespace elements
{
    namespace fire
    {
        int flame;
        ...
    }
    float water;
}

namespace myth
{
    using Jill::fetch;
    using namespace elements;
    using std::cout;
    using std::cin;
}
  • 可以通过省略名称空间的名称来创建未命名的名称空间

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

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

相关文章

FPGA 20个例程篇:19.OV7725摄像头实时采集送HDMI显示(二)

第七章 实战项目提升&#xff0c;完善简历 19.OV7725摄像头实时采集送HDMI显示&#xff08;二&#xff09; 在正式介绍OV7725 CMOS Sensor视频采集前&#xff0c;首先需要去详细说明OV7725的寄存器配置接口&#xff0c;这里有OmniVision公司推出的官方手册 “OV7725_software_…

8个必须掌握的Blender拓扑技巧

组合 3D 模型的过程对后续过程影响很大 - 稍后编辑的难易程度、应用光照和着色器时的外观效果如何、动画时变形的难易程度等等。 一个好的模型对于 CG 管道的所有其他部分的良好运行至关重要。 另一方面&#xff0c;凌乱的拓扑结构会使流程的其余部分成为一场灾难。 你能做些…

IB地理科补习有用吗?

IB地理科的补习如何帮助学生改变学科的表现&#xff1f;这可以从几方面来做分析。 1. 训练 第一是训练。我们老师会按来补习的同学的个人需求、时间和个性&#xff0c;提供很多不同程度的训练&#xff0c;帮助他们建立一个正确的能力系统&#xff08;skill set&#xff09;去应…

二、预训练模型预测(Datawhale组队学习)

文章目录安装配置环境ImageNet预训练图像分类模型预测单张图像-英文载入预训练图像分类模型图像预处理执行图像分类预测预测结果分析ImageNet预训练图像分类模型预测单张图像-中文预训练图像分类模型图像预处理执行图像分类预测预测结果分析ImageNet预训练图像分类模型预测视频…

汽车CAN总线硬件电路原理

根据ISO 11898的定义&#xff0c;物理层被细分成3 个子层&#xff0c;它们分别是物理信令&#xff08;位编码定时和同步&#xff09;、物理媒体连接&#xff08;驱动器和接收器特性&#xff09;和媒体相关接口&#xff08;总线连接器&#xff09;。物理信令子层和数据链路层之间…

打包iOS App并上架到TestFlight测试

开发者账号 首先需要注册一个开发者账号&#xff0c;不然什么都免谈。在手机Apple Developer上注册给钱就行了&#xff0c;个人开发者一年688元。 打包App App开发好后&#xff0c;就可以通过XCode打包。打包前选好版本号&#xff0c;不要跟以前提交的一样&#xff0c;重复的…

亚马逊云科技携手普华永道,助力泉峰集团破解数据治理与使用难题

大数据时代的到来&#xff0c;掀起了企业数字化转型的热潮&#xff0c;对于制造行业的企业来说&#xff0c;除了顺应发展潮流快速开启数字转型之外&#xff0c;以创新思维不断拓展业务广度&#xff0c;对于自身发展也有着格外重要的意义。数字化水平能否与创新发展的脚步保持一…

Acwing---1237.螺旋折线

螺旋折线1.题目2.基本思想3.代码实现1.题目 如下图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点 (X,Y)(X,Y)(X,Y)&#xff0c;我们定义它到原点的距离 dis(X,Y)dis(X,Y)dis(X,Y) 是从原点到 (X,Y)(X,Y)(X,Y) 的螺旋折线段的长度。 例如 dis(0,1)3,dis(−2,−1)9di…

账户系统从0到1搭建

一、什么是账户/账户的作用&#xff1f;账户是记录账户所属人&#xff08;账户主体&#xff09;资产增减变化的载体&#xff0c;简单来说账户系统就是用来记账的&#xff0c;这也是账户系统最核心的功能&#xff0c;在这个基础之上也会根据业务需要衍生出来的其他附属功能。为了…

Kotlin 元编程之 KSP 实战:通过自定义注解配置Compose导航路由

在上一篇 Kotlin 元编程之 KSP 全面突破 中&#xff0c;通过几个设计模式相关的例子来生成代码&#xff0c;其逻辑都比较简单&#xff0c;没有涉及到Android相关的API 业务类&#xff0c;而本文的例子会涉及到使用 Android API 相关的代码。 在之前Jetpack Compose中的导航路由…

【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)

【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结&#xff08;建议收藏&#xff01;&#xff01;&#xff09; 参考资料&#xff1a; 美团技术团队&#xff1a;Innodb中事务隔离级别和锁的关系 数据库的锁&#xff0c;到底锁的是什么&#xff1f; 阿里面试&#xff1a;说说…

来给博客除草了:Learned Indexes for a Google-scale Disk-based Database

1. 引言 这是一篇业界发表在NeurlIPS 2020的Wip论文《Google规模的基于磁盘的数据库的学习索引》。自从学习索引祖师爷Tim KraskaMIT在SIGMOD 2018发表了第一篇learned index的工作之后&#xff0c;有关学习索引的paper呈现 increasing trend。目前&#xff0c;较多的工作focu…

Java基础漏洞(四)

&#xff08;1&#xff09;递归调用的内存 我们定义一个类A&#xff0c;在类A中定义方法test来验证递归。在程序中&#xff0c;当条件符合的时候会不断的递归&#xff0c;只有遇到终止条件时才不再递归&#xff0c;然后便会执行递归语句之下的语句。 如以下程序&#xff1a;当…

高效节能 | 智慧灯杆综合管理解决方案

智慧灯杆的应用越来越广泛&#xff0c;园区、景区、道路照明&#xff0c;三站一场等户外场所大规模铺设路灯&#xff0c;通过智慧物联平台远程控制&#xff0c;可以实现高效节能和智能化运维管理。以解决传统运维管理中&#xff0c;不同路线路灯设备控制不统一&#xff0c;设备…

Yjs解析

本文引用自 摸鱼wiki 1. YATA算法解析 YATA算法是Yjs库的核心冲突解决算法&#xff0c;这里主要讲解下这个算法成立的三个规则&#xff1a; 规则1&#xff1a;禁止发生冲突的插入操作之间的origin连线&#xff08;红线&#xff09;发生交叉。 如上图所示&#xff0c;图中展示…

IDEA创建SpringBoot的Web项目,并使用外部Tomcat

IDEA创建SpringBoot的Web项目&#xff0c;并使用外部Tomcat 目录IDEA创建SpringBoot的Web项目&#xff0c;并使用外部Tomcat一、创建工程二、使用外部Tomcat一、创建工程 1.首先新建一个springboot的war工程&#xff0c;并且将外部的Tomcat整合进我们的idea中&#xff0c;我们…

GW1NSR-LV4CQN48GC6/I5 FPGA呼吸灯

环境 pwm.v $ cat pwm.v module Pwm( input clk, input [31:0] period, input [31:0] duty, output pwmout ); reg [31:0] counter; reg r_pwmout; always (posedge clk) begin if(counter < duty) begin r_pwmout 1; end…

裸机与RTOS到FreeRTOS基础 | FreeRTOS一

目录 一、裸机与RTOS 1.1、裸机 1.2、RTOS 二、FreeRTOS简介 2.1、介绍 2.2、特点 2.3、如何查找相关资料 三、FreeROTS基础 3.1、任务调度 3.2、任务状态 一、裸机与RTOS 1.1、裸机 不带操作系统&#xff0c;又称为前后台系统&#xff0c;前台系统指中断服务函数&a…

docker搭建Openldapphpldapadmin

1&#xff1a;拉取镜像 docker pull osixia/openldap:1.5.0 docker pull osixia/phpldapadmin:0.9.0 2: 编写docker-compose.yaml cd /data/docker/ldap vi docker-compose.yaml docker-compose.yaml内容如下&#xff1a; version: 3.1 services:openldap:image: osixia/o…

python入门常用知识

文章目录前言一、定义二、Tips1.常用方法2. 常用modulestatistics 统计分析常用模块SciPy 算法及统计分析库总结前言 本文用来记录在使用python时一些基础的定义、基础用法或Tips。 一、定义 多变量定义&#xff1a; a, b, c 0, 0, 0数组定义&#xff1a; # 变量定义 a …