C++第九章:内存模型与名称空间

C++在内存中存储数据方面提供了多种选择。可直接选择保留在内存中的时间长度(存储持续性)以及程序哪一部分可以访问数据(作用域和链接)等。

  • 单独编译

程序分为三个部分:

  • 头文件:包含结构声明和使用这些结构的函数原型。
  • 源代码文件:包含于结构有关的函数代码
  • 源代码文件:包含调用与结构有关的函数代码

一般头文件中不包含函数定义与变量声明。如果程序的两个文件均包含该文件会错误。

头文件中通常包含的内容:

  • 函数原型
  • 使用#define或const定义的符号变量
  • 结构声明
  • 类声明
  • 模板声明
  • 内联函数

包含自定义的头文件时使用双引号。

如:#include"myheader.h"

不能使用尖括号,如果使用尖括号,C++编译器将在存储标准头文件的主机系统的文件系统中查找。

1.2 头文件管理

在同一个文件中只能将头文件包含一次,为了防止重复包含,在头文件中包含头文件采用如下技术:

#ifndef FILENAME_H_

#define FILENAME_H_

//place include file contents here

#endif

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

作用域:描述了名称在多大范围内可见。

链接性:描述名称如何在不同单元间共享

自动存储持续性:函数中声明的参数与变量。作用域为局部,没有链接性。

全局变量与局部变量可以同名,在局部变量定义的代码块中,全局变量被屏蔽。

自动变量被存放在栈中,栈是一种后进先出(LIFO)的结构。

静态持续变量:外部链接性,内部链接性与无链接性。

1)外部链接性:即全局变量,外部文件可访问,在函数外定义。整个程序只能有一个同名的外部变量,同一程序的不同文件不能定义同名的外部变量。

2)内部链接性:在函数外定义,使用关键字static。作用域为整个文件。

3)无链接性:在代码块内部定义,使用关键字static。作用域为代码块,生存周期为整个函数。

静态变量均为零初始化的,即若没赋初值,则系统自动赋为零。

其他文件引用本文件的全局变量必须使用extern关键字。如:extern 数据类型 全局变量标识符。

无链接性的静态变量作用域在代码块中,但是生存周期为整个程序,而且值保持不变。且定义和初始化只进行一次,第二次调用时,跳过初始化。

限定符:const和volatile。

说明符:auto,register,static,extern,thread_local,mutable。

volatile:不进行优化,将某变量存入寄存器。

mutable:允许修改const的结构成员。

例:struct data{mutable int a};

const data veep={…};veep.a=10; //a的值可被修改

const规定了全局变量为内部链接性,不可在不同文件中共享,但可使用extern覆盖。

在函数或者代码块中定义const常量的话,作用域为代码块。

函数不可以嵌套定义,

使用new运算符初始化:

int *pi=new int (6);

定位new运算符:

例:char buffer1[50];

int *p2;

p2=new (buffer1) int;

为p2分配buffer1中的一块存储区域。

名称空间

声明区域:可以在其中进行声明的区域,如全局变量为整个文件,局部变量为所在的代码块。

潜在作用域:从声明区域开始,到声明区域的结尾。

作用域:变量对程序可见的范围

namespace Jack{double pail,…}

名称空间可以是全局的,可也以位于另一个名称空间中,但不能位于代码块中。

using声明:由被限定的名称和它前面的关键字using构成,如:using Jill::fetch;不支持重名。

using编译指令:using namespace Jill;在代码块中支持重名。

未命名的名称空间的潜在作用域为从声明点到该声明区域的末尾。

C++ Primer Plus学习:第九章的更多相关文章

  1. C语言学习第九章

    学习C语言的最后一节课了,原因嘛上一章的末尾说过了,其实写这篇博客的时候以后开始学习Java一个多月了,一直因为各种各样的原因没有坚持做到每天一篇学习记录,可能主要因为懒吧....也有点笨,Java的 ...

  2. 【转载】Gradle学习 第九章:Groovy快速入门

    转载地址:http://ask.android-studio.org/?/article/17 To build a Groovy project, you use the Groovy plugin ...

  3. Python爬虫学习==>第九章:正则表达式基础

    学习目的: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特点字符.及这些特点字符组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正式步骤 Step1 ...

  4. java并发学习--第九章 指令重排序

    一.happns-before happns-before是学习指令重排序前的一个必须了解的知识点,他的作用主要是就是用来判断代码的执行顺序. 1.定义 happens-before是用来指定两个操作 ...

  5. C++ Primer高速学习 第一章 获得二:输入和输出 (IO)

    什么是输入输出.即Input-Output,缩写是非常装B的IO?请看经典民间解释: C++语言的输入输出是指信息从外部输入设备(如键盘.磁盘等)向计算机内部(内存)输入(即Input)和从内存向外单 ...

  6. UNP学习第九章 基本名字与地址转换

    之前都用数值地址来表示主机(206.6.226.33),用数值端口号来标识服务器. 然而,我们应该使用名字而不是数值:名字比较容易记,数值地址可以改变但名字保持不变. 随着往IPv6上转移,数值地址变 ...

  7. 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag 注:哈哈哈,第九章终于来啦 ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第九章:贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第九章:贴图 代码工程地址: https://github.com/j ...

  9. 鸟哥的linux私房菜——第九章学习(vim编辑器)

    第九章vim编辑器 1.0).vi与vim Linux下文本界面的文书编辑器通常会有常常听到的就有: emacs, pico, nano, joe, 与 vim 等等. vi的优势: 所有的 Unix ...

随机推荐

  1. HCNP - Server

    Server DHCP配置 DHCP服务器配置: 第一种方法:自动配置 路由上面配置网关,开启dhcp服务 [R1]dhcp enable [R1-GigabitEthernet0/0/0]dhcp ...

  2. 笔记(assert 断言)

    并发:在同一个时间段交替执行多个任务并行:在同一个时间点同时执行多个任务串行:同时执行的多个任务按顺序执行(换句话说就是一个任务执行完后才能执行下一个任务) #mysql limit用法: selec ...

  3. 两组数据的均值是否具有显著差异的T检验

    最近在做分析的时候,遇到了T检验,然而对于没有统计学背景的人来说完全不知如何下手 当然了,遇到问题第一反应就是百度. 果然百度出来了很多链接,当时第一次直接选择了用Excel去做T检验.下面是源数据 ...

  4. 20155224聂小益的Linux学习

    20155224聂小益的虚拟机安装 虚拟机安装 一开始,我在下载VirtulBox及Ubuntu遇到了一些困难,老实说点进去看到一大堆英文界面的时候真的是有点吓到.不过几秒钟之后就发现这并没有什么哈哈 ...

  5. 【转载】GitHub详解

    原文:GitHub详解 GitHub详解 GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目.它由GitHub公司(曾称Logical Awesome)的开发者Chr ...

  6. centOS上安装最新git 2.4.0

    git 地址: https://www.kernel.org/pub/software/scm/git/ 1.  先安装一堆依赖 yum install curl curl-devel zlib-de ...

  7. 【转】 mysql使用federated引擎实现远程访问数据库(跨网络同时操作两个数据库中的表)

    原文转自:http://www.2cto.com/database/201412/358397.html 问题: 这里假设我需要在IP1上的database1上访问IP2的database数据库内的t ...

  8. 2.openldap安装

    1.安装步骤如下 获取软件包 安装软件包(rpm或者源码编译) 生产openldap配置文件及数据库文件 配置 添加目录树条目 加载slapd进程 验证 2.所需安装包说明 openldap,open ...

  9. 微信小程序---scroll-view在苹果手机上触底或触顶页面闪动问题

    在项目开发中遇到一个关于scroll-view的的问题,具体如下: 项目要求是横向滚动,由于直接在scroll-view组件设置display:flex不生效,因此考虑直接在scroll-view下增 ...

  10. openresty 安装指南

    对于一些常见的 Linux 发行版本,OpenResty 提供 官方预编译包.确保你首先用这种方式来安装. 如果您还没有下载 OpenResty 的源码包, 请到 Download 页下载. 首先,您 ...