首页 > 编程语言 >自修C++PrimerPlus--第九章(上)

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

时间:2024-09-23 18:19:04浏览次数:10  
标签:这个 里面 变量 -- 函数 C++ PrimerPlus extern 定义

目录

1.类作用域

1.1基本介绍

1.2作用域为类的常量

1.3作用域内枚举

2.内存模型和名称空间

2.1头文件重复包含问题

2.2存储连续性

2.3独立编译的过程

2.4链接属性

2.4.1外部连接性

2.4.2内部连接性

2.4.3无连接性

2.5自动变量和栈

2.6寄存器变量

2.7静态变量

2.8extern举例说明


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声明这个变量,然后就可以正常使用;

标签:这个,里面,变量,--,函数,C++,PrimerPlus,extern,定义
From: https://blog.csdn.net/binhyun/article/details/142318608

相关文章

  • Android Studio 快捷用法
    AndroidStudio快捷用法路一直都在   原文链接    2017年03月10日发布AndroidStudio已经用了两年左右了,对快捷键的使用一直如同段誉的六脉神剑一般,偶尔会biu不出来,从来没有静下心来耐心的看完Tips,为了避免这种尴尬,决定把Tips完整的练习一遍并记录在案。......
  • java 如何实现判断一个对象所有的属性是否为空
     能适配所有类型的:Personperson=newPerson();person.setId(0);//---truePersonperson=null;//---truePersonperson=newPerson();person.setName("xxx");//---falsePersonperson=newPers......
  • WPF StatusBar update periodically via System.Timers.Timer
    //xaml<Windowx:Class="WpfApp406.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • InvalidDataAccessApiUsageException 和 Write operations are not allowed in read-o
    InvalidDataAccessApiUsageException和Writeoperationsarenotallowedinread-onlymode解决方法2016年04月07日12:35:02阅读数:14221这些天写webservice,一直在测接口,get方法都没问题,就从昨晚开始测save方法的时候出现了这个错误Writeoperationsarenotallo......
  • struts2配置文件中的method={1}详解
    转载:fifiyong  https://www.cnblogs.com/fifiyong/p/6027565.htmlstruts.xml中的配置:<!--配置用户模块的action--><actionname="user_*"class="userAction"method="{1}"><resultname="registPage">/W......
  • window.location.href和window.open的几种用法和区别
    window.location.href和window.open的几种用法和区别2017年05月26日09:47:40阅读数:823阅读目录一、location.href常见的几种形式二、location.href不同形式之间的区别三、location.href总结四、window.location.href和window.open的区别使用js的同学一定知道j......
  • Python装饰器(不带参/带参)
    普通装饰器示例普通装饰器通常用于在不修改函数签名的情况下增强函数功能。#定义一个普通装饰器defmy_decorator(func):defwrapper():print("Somethingishappeningbeforethefunctioniscalled.")func()print("Somethingishappenin......
  • Javascript调试命令——你只会Console.log() ?
    Javascript调试命令——你只会Console.log()?https://segmentfault.com/a/1190000012957199Console对象提供对浏览器控制台的接入(如:Firefox的WebConsole)。不同浏览器上它的工作方式是不一样的,但这里会介绍一些大都会提供的接口特性。Console对象可以在任何全局对象中访问,......
  • electron中定义ipc的完美方案
    前语发现在主进程和渲染进程通信的设计中,很多代码都是重复的,导致最后非常臃肿,且不利于后期扩展方案electron项目中核心文件结构如下|--index.js|--index.html|--ipc|--handlers|--other.js|--xxx.js|--index.js|--preload.jsipc/handle......
  • 邓州市白泊便利店(个体工商户)
    邓州市白泊便利店(个体工商户)我要认领在线联系下载报告 风险监控关注开业小微企业 一键更新企业数据 我要编辑企业信息统一社会信用代码:92411381MADF0XLAX7 更多工商信息电话:暂无电话 全网电话(1)经营者:白泊关联1家企业邮......