Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >自修C++PrimerPlus--第九章(上)

自修C++PrimerPlus--第九章(上)

作者头像
阑梦清川
发布于 2025-02-24 06:17:13
发布于 2025-02-24 06:17:13
720
举报
文章被收录于专栏:学习成长指南学习成长指南

1.类作用域

1.1基本介绍

我们的成员函数在进行定义的时候,需要在这个成员函数的前面添加上这个域作用限定符,调用这个成员函数的时候,需要使用这个对象进行调用,因为类里面定义的内容的作用域是这个类,因此不同的这个类里面可以定义相同的变量;

1.2作用域为类的常量

下面的这个案例里面,我们本来是想要通过这个12进行costs数组的定义,但是这个months这个变量只有在定义对象的时候才会生效,因此这个时候直接运行,编译器检查的时候就会报错;

这个时候,我们可以有两种解决方案,一个就是使用枚举进行这个months的定义,这个时候作用域就是这个类,我们不需要创建对象就可以直接使用这个变量,进而这个数组定义的时候也是可以使用的;

或者是在这个第一种的基础上进行这个变量的定义的时候,加上这个static这个时候的变量就是静态的成员变量,就属于全局区的变量,不是和对象一起的,而是所有的对象共有的,我们这个时候就可以使用这个变量进行数组的声明;

1.3作用域内枚举

我们直接使用枚举,因为这个里面的枚举量有相同的名字,因此这个时候发生冲突就会报错;

这个时候,我们可以使用这个新的枚举方法,就是定义的时候加上这个class或者是struct进行枚举量的定义,这个时候定义的枚举量就有了自己的这个作用域,即使名字是一样的,也不会发生冲突

无论哪个方式,我们需要使用这个枚举名限制枚举量,表明这个量的作用域的大小;

2.内存模型和名称空间

2.1头文件重复包含问题

我们可以使用这个#ifndef加上这个头文件的名字,#define加上这个头文件的名字,#endif表示的就是如果我们的这个头文件已经存在了,那么这个部分就不会再被包含了;

这个和#pragma once达到的这个效果是一样的,都是为了防止这个重复包含,头文件的重复包含在进行编译的时候也会有这个编译错误,报错的原因就是我们的某些变量之类的被重复定义;

2.2存储连续性

自动存储连续性:就是在我们的函数里面进行定义的变量,无论是我们的main函数还是我们的这个自定义函数,这个里面定义的变量的生命周期都是 有限的,即就是在这个函数体里面是有效的

静态存储连续性:就是在全局区里面定义的这个变量,类似于我们熟知的这个全局变量,全局变量的属性在这个教材里面被叫做静态存储持续性,当我们的程序退出的时候,这个全局变量的生命周期才会结束;

动态存储连续性:就是我们的这个动态开辟的内存空间里面存放的变量,这个里面的变量就是我们自己new出来的空间,需要我们自己delete空间的里面的变量;

2.3独立编译的过程

我们的两个file1.cpp和file2.cpp文件会被首先进行预处理的工作,生成临时文件,编译之后生成这个目标文件,进行连接之后就会被合并成为一个可执行文件;

2.4链接属性

static可以改变这个连接属性,可以把一个变量或者是函数的外部连接属性修改为内部的连接属性,而且不同的这个文件里面都可以有同名的静态函数;

2.4.1外部连接性

就是多个文件并存的时候,所有的文件都可以使用的变量就是外部连接属性;

在这个地方可以顺便说一下这个extern和static关键字,这个extern就是进行声明,例如我们在test1.cpp文件里面定义了一个变量temp=10,这个时候我们的test2.cpp想要使用,就可以使用这个extern关键字进行声明;

我们在test1.cpp文件里面定义的这个int a=10就是具有外部连接性,这个test2.cpp文件也是可以看见的,只不过我们不可以直接使用,需要加上这个extern关键字进行声明之后才可以使用;

我们的这个static关键字就是加上之后,这个即使使用这个extern进行声明,这个变量的作用域就是在这个当前的文件,不可以修改了,相当于是对于这个变量进行了保护;

2.4.2内部连接性

在某一个cpp里面定义了一个全局的变量,这个时候这个cpp里面的所有的函数都可以使用,无论是这个main函数还是其他的各种自定义函数,都是可以使用的,这个时候我们就称这个全局变量具有内部连接属性;

2.4.3无连接性

就是例如我们在某一个函数里面定义了一个变量,即使是在这个cpp文件里面,也只有我们这个定义这个变量的函数里面可以使用这个变量,这个时候他就是局部变量,生命周期就是这个函数所在的代码块;

无连接属性指的就是函数里面定义的局部变量,只有这个函数自己可以使用,其他的这个cpp文件里面的函数不可以使用;这个局部变量在这本书里面叫做自动变量,两个都是一个意思;

2.5自动变量和栈

自动变量就是我们上面说过的这个局部变量,这个局部变量的数量随着这个函数的结束就减少了,随着另外一个函数的调用这个局部变量的数量就会增加,这个数量的变化需要我们设计一个结构进行这个局部变量的管理;

我们使用栈进行对于局部变量的管理,使用栈顶指针和栈底指针进行这个数据的控制;

2.6寄存器变量

这个寄存器也是类似于这个栈一样进行数据的存储的的结构,而且是计算机里面真实存在的结构,使用这个寄存器存储这个定义的变量,就可以提高我们的这个变量的访问速度,这个和我们的计算机的层级结构级别有关;

使用register关键字就可以把这个变量定义为寄存器变量,加快访问速度;

2.7静态变量

我们的编译器会把static定义的这个变量初始化为0,但是普通的这个变量如果我们自己没有进行初始化,这个时候他就是随机值,这个也是静态变量的一个特点;

2.8extern举例说明

我们的extern int cats=20这个其实是定义,不是声明,因为声明的时候我们是不可以初始化的,就是只写这个类型和变量的名字,不写数值;

extern之后(其实在这个file01文件里面不进行extern,在其他的想要使用的文件里面进行extern就可以了,就是没有必要两个文件里面都写这个extern,只需要在使用的文件里面写就可以了,例如我们的这个file02文件想要使用,只需要在这个file02里面加上这个extern声明即可),其他的文件就可以看到了,但是其他的文件想要使用,就需要在自己所在的这个文件加上extern声明这个变量,然后就可以正常使用;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
extern关键字详解
extern放在变量或者函数之前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
WindSun
2019/08/29
1.8K0
C++的extern关键字知识点
转载自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 感觉写的比百毒上搜到的大多数要好! 1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。       也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告
老白
2018/03/19
1K0
深入理解extern使用方法
我们一般把全部的全局变量和全局函数的实现都放在一个*.cpp文件中面,然后用一个同名的*.h文件包括全部的函数和变量的声明。如:
全栈程序员站长
2022/07/07
4930
C++ 温习笔记(1) - main函数,类对象,作用域,防止头文件二次编译
main 函数返回值c和c++不一样:c可以为void,c++只能是int c语言func()里面可以传任意参数,c++则认为等同于func(void) int main(int argc, const char* argv[]):第一个为传入参数个数,第二个是传入参数,默认空为1和路径
干货满满张哈希
2021/04/12
1.1K0
c语言全局变量和局部变量问题汇总
局部变量能够与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内能够定义多个同名的局部变量,比方在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
全栈程序员站长
2022/07/11
9370
C++随记(八)---存储持续性、作用域和链接性
该文介绍了C++中的存储持续性、作用域和链接性,以及函数的作用域、链接性和静态局部变量,并探讨了C++中的函数调用机制和作用域规则,以及命名空间的使用方法。
TeeyoHuang
2017/12/28
1.1K0
《C语言深度剖析》---------关键字(1)
为什么一定要加载到内存上面呢,因为CPU访问内存的速度非常快,如果要是放到硬盘里面;
阑梦清川
2025/02/24
540
《C语言深度剖析》---------关键字(1)
面试中常见的 C 语言与 C++ 区别的问题
C和C++中都有关键字static关键字,那么static关键字在C和C++中的使用有什么区别?请简述之。
C语言与CPP编程
2020/10/22
9420
面试中常见的 C 语言与 C++ 区别的问题
C语言变量的作用域和类别-学习二十
本文最后更新于2022年02月14日,已超过13天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
XG.孤梦
2022/03/01
1K0
C语言变量的作用域和类别-学习二十
C语言深入理解extern用法 | 变量声明 | static
我们一般把所有的全局变量和全局函数的实现都放在一个*.cpp文件里面,然后用一个同名的*.h文件包含所有的函数和变量的声明。如:
CtrlX
2022/11/22
1.8K0
C++变量总结束 | 输出各种变量的值
C++中一个函数一般由:声明部分、执行语句两部分组成,声明部分的作用是对有关的标识符的属性进行说明,对于函数,声明和定义的区别是明显的,函数的声明是函数的原型,而函数的定义是函数功能的确立。
小林C语言
2020/12/01
2.1K0
C++变量总结束 | 输出各种变量的值
C语言变量的存储方式、作用域和生命周期
1、作用域问题:在一个函数中定义的变量,在其他函数中能否被引用?在不同位置定义的变量,在什么范围内有效?
CtrlX
2022/11/22
9710
C++中的作用域与生命周期
Pascal之父Nicklaus Wirth曾经提出一个公式,展示出了程序的本质:程序=算法+数据结构。后人又给出一个公式与之遥相呼应:软件=程序+文档。这两个公式可以简洁明了的为我们展示程序和软件的组成。
恋喵大鲤鱼
2018/08/03
1.2K0
c++存储类
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类:
爱学iOS的小麦子
2023/01/18
7530
C++ 存储类
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类:
C语言与CPP编程
2020/12/02
9300
c语言局部变量、全局变量、静态变量、内部函数、外部函数、声明、定义、extern作用总结
  前两种方式定义的变量可以在函数内任何地方使用,而第三种方式定义的变量只能在复合语句内使用。
vv彭
2020/10/27
10.7K0
c语言局部变量、全局变量、静态变量、内部函数、外部函数、声明、定义、extern作用总结
完全入门C语言
C语言是一门通用的计算机编程语言,广泛应用于底层开发。其设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。有良好的跨平台的特性。 同时C语言还是面向过程的编程语言,这与JAVA C++等面向对象的编程语言有所不同。 目前主流的C语言编译器有:GCC Clang MVSVC等
Yui_
2024/10/15
2090
完全入门C语言
计算机萌新的成长历程——初识C语言16
大家好,很高兴又能跟各位朋友见面了,前面我们花了两篇内容来探讨操作符的相关内容,今天咱们要开始探讨新的内容了——常见关键字。
蒙奇D索隆
2023/10/13
1950
计算机萌新的成长历程——初识C语言16
必须使用extern的场景
即使不使用extern,在头文件中定义的全局变量,也可以被引用了该头文件的外部源文件使用。那extern存在的意义是什么?它要解决什么问题?
村子里的设计师
2023/05/20
5430
7.5 C语言变量的存储方式和生存期
4、全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。
小林C语言
2020/12/07
8160
7.5 C语言变量的存储方式和生存期
相关推荐
extern关键字详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档