热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《C++PrimerPlus》学习笔记4

《C++PrimerPlus》学习笔记4第9章内存模型和名称空间1、头文件中包含的内容1)函数原型2)使用#defin

《C++ Primer Plus》学习笔记4

第9章 内存模型和名称空间

===================================================================================================================
1、头文件中包含的内容
1)函数原型
2)使用#define 或者 const定义的符号常量
3)结构声明
4)类声明
5)模板声明
6)内联函数
2、在自己头文件中,应当使用引号而不是尖括号;如果文件名包含在尖括号中,则C++编译器将在存储标准头文件的主机系统的文件系统中查找,但如果文件名包含在尖括号中,则C++编译器将首先查找当前的工作目录或源代码目录。
3、头文件的管理
大多数标准C和C++头文件都使用下面这个防护方案

#ifndef COORDIN_H_
#define COORDIN_H_
//place include file contents here
#endif

4、存储持续性
C++中使用3中不同的方案来存储数据,这些方案的区别在于数据保留在内存中的时间
1)自动存储持续性
在函数定义中声明的变量包括函数参数的存储就为自动的,在程序开始执行时被创建,在执行完函数或代码块时候,使用的内存被释放。C++有两种存储持续性为自动的变量。
2)静态存储持续性
在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都是静态。他们在程序的整个运行过程中都存在,C++有3种存储持续性为静态的变量。
3)动态存储持续性
用new操作符分配的内存一直存在,直到使用delete操作符将其释放或程序结束为止。这种内存的存储持续性为动态,又称为自由存储。
5、如果变量存储在寄存器中,则没有内存地址,因此不能将地址操作符用于寄存器,不能获取变量的地址。

void gromb(int *)
int main()
{
    int x;
    register int y;
    gromb(&x); 
    gromb(&y); //不允许
}

6、静态持续变量
1)C++为静态存储持续性变量提供了3中链接性:外部链接性、内部链接性、无链接性。在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0.

int global = 1000; //外部链接性在代码块外面声明它
static int one_file = 50; //内部链接性在代码块声明它且使用static限定符
int main()
{
    ……
}
void functl(int n)
{
    static int count = 0;//创建没有链接性的静态持续变量,在代码块内声明它
    int llama = 0;
}

2)所有的静态持续变量都有下面的两个初始化的特征:
①未被初始化的静态变量的所有位都被设置为0
②只能使用常量表达式来初始化静态变量(常量表达式可以是字面值常量、const常量、enum常量、sizeof操作符)
3)定义声明double warming = 0.3,不能在引用声明中初始化变量,使用extern重新声明

extern double warming = 0.5; 无效
extern double warming;

4)全局变量虽然我们尽量少用,但是它也有一定的好处,可以让多个函数使用同一个数据块,常常使用const来防止数据被修改。

const char * const months[12] = 
{
    "January", "February", "March"…………
}

第一个const防止字符串被修改,第二个const确保数组中每个指针始终指向它最初指向的字符串。
7、存储说明符,
auto 将变量声明为自动变量;
register用于声明中指示寄存器存储类型
static 被用在作用域为整个文件的声明中时,表示内部链接性;被用于局部声明中,表示局部变量的存储持续性为静态的。
extern 表明引用声明,即声明引用在其他地方定义的变量。
mutable 根据const来解释它
8、如果出于某种原因,程序员希望某个敞亮的链接性为外部的,则可以使用extern关键字来覆盖默认内部链接性

extern const int states = 50;

在这种情况下,必须在所有该常量的文件中使用extern关键字来声明它,这与常规外部变量不同,定义常规外部变量时,不必使用extern关键字,但在使用该变量的其他文件中必须使用extern,另外可以初始化extern const变量,实际上,必须这么做,因为const数据必须初始化。
9、布局new操作符

#include 
struct chaff
{
    char dross[20];
    int slag;
};
char buffer1[50];
char buffer2[500];
int main()
{
    chaff *p1, *p2;
    int *p3, *p4;

    p1 = new chaff; //从堆中分配空间给chaff
    p2 = new int [20]; //在堆中分配空间给一个包含20的元素的int数组

    p2 = new (buffer1) chaff; //从buffer1中分配空间给结构chaff
    p4 = new (buffer2) int[20];//从buffer2中分配空间给一个包含20的元素的int数组
}

10、名称空间
1)声明区域 是可以在其中进行声明的区域,在函数外面声明全局这种变量,其声明区域为其声明所在的文件,对于在函数中声明的变量,其声明区域为其声明所在的代码块。
2)潜在作用域
变量的潜在作用域从声明开始,到其声明区域结尾,潜在作用域比声明区域小,这是由于变量必须定义后才能使用。
3)C++提供两种机制,using声明和using编译指令来简化对名称空间中名称的使用。
using声明使特定的标示符可用,using编译指令使整个名称空间可用。
4)如果名称空间和声明区域定义了相同的名称,试图使用using声明将名称空间的名称导入该声明区域,则这两个名称会发生冲突,从而出错。如果使用using编译指令将该名称空间的名称导入该声明区域,则局部版本将隐藏名称空间版本;使用using声明比使用using编译指令更加安全。由于它只导入指定的名称,如果该名称与局部名称发生冲突,编译器会发生指示,using编译指令导入所有名称,包括不需要的名称,发生冲突之后会之间覆盖,也不会发出警告。
5)不要再头文件中使用using编译指令,首先这样做掩盖了要哪些名称可用;另外,包含头文件的顺序可能影响程序的行为,如果非要使用编译指令using,应将其放在所有预处理编译指令#include之后。
6)对于using声明,首选将其作用域设置为局部而不是全局。
11、补充静态变量在整个额程序执行期间都存在,对于在函数外面定义的变量,其所属文件中位于该变量的定义后面的所有函数都可以使用它(文件作用域),并可在程序的其他文件中使用(外部链接性)另一个文件要使用这中变量,必须使用extern关键字来声明它,对于文件间共享的变量,应用一个文件中包含其定义声明(不适用extern),并在其他文件中包含引用声明(使用extern)。函数外面使用关键字static定义的变量的作用域为整个文件,但是不能用于其他文件(内部链接性),在代码块使用关键字static定义变量被限制哎该代码块内(局部作用域,无链接性),但在整个程序执行期间,它都一直存在并且保持原值。
12、在默认情况下,C++函数链接性是外部的,因此可在文件间共享,但是使用关键字static限定的函数的链接性为内部,被限制在定义它的文件。
》》》完结2014.7.18 9:50


《C++ Primer Plus》学习笔记4,,

《C++ Primer Plus》学习笔记4


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
author-avatar
杨仕卫123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有