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

1.头文件管理

     一般可将程序分为3部分:

     (1)头文件:包含结构声明和使用这些结构的函数的原型。(2)源代码文件:包含与结构有关的函数的代码。(3)源代码文件:包含调用与结构相关的函数的代码。

      注意,只要将源代码文件加入到工程中,而不用加入头文件。这是因为#include指令管理头文件。另外,不要使用#include来包含源代码文件,这样将导致多重声明。

      头文件常包含的内容有:函数原型;使用#define或const定义的符号常量;结构声明;类声明;模板声明;内联函数。

      常用代码片段为:

2.自动变量

      作用域为局部,没有链接性。

      auto用于默认状态下的自动变量,程序员几乎不使用它。有时候,它被用来向读者澄清代码的含义。例如,可以借助于表明,程序中特意创建了一个自动变量,它将覆盖全局定义。

      register是另一种形式的自动变量。如果变量被存储在寄存器中,则没有内存地址,因此不能将地址操作符用于寄存器变量。

3.静态变量

      编译器分配固定的内存块来存储所有的静态变量,这些变量在整个程序执行期间一直存在。未被初始化的静态变量的所有位都被设置为0。只能使用常量表达式来初始化静态变量。

      一共3种静态变量:1)要想创建链接性为外部的静态持续变量,必须在代码块的外面声明它;2)要创建链接性为内部的静态持续变量,必须在代码块的外面声明它,并使用static限定符;3)要创建没有链接性的静态持续变量,必须在代码块内声明它,并使用static限定符。

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/1.jpg

      链接性为内部的变量只能在其所属文件中使用;常规外部变量都具有外部链接性,可在其他文件中使用。对于外部链接性变量,有且只有一个文件包含了该变量的外部定义。其他文件要使用该变量,必须在引用声明中使用关键字extern。

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/2.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/3.jpg

看下面两个文件中关于静态变量的应用:

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/4.jpg

     对于无链接性的静态变量,程序只在启动时进行一次初始化。以后再调用函数时,将不会像自动变量那样再次被初始化。

4.volatile和mutable

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/5.jpg

5.函数和链接性

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/6.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/7.jpg

6.布局new操作符

      通常,编译器使用3块独立的内存:一块用于静态变量(可能再细分),一块用于自动变量,另外一块用于动态存储。常规new操作符负责在堆(heap)中找到一个足以能够满足要求的内存块。new操作符另外一种变体,称为布局(placement) new 操作符,它能指定要使用的位置。

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/8.jpg

下面是一个范例程序:

程序输出:

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/9.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/10.jpg

程序说明:

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/11.jpg

7.名称空间

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/12.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/13.jpg

1)using声明和using编译指令

      C++有两种机制来简化对名称空间中名称的使用。using声明使特定的标识符可用,using编译指令使整个名称空间可用。

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/14.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/15.jpg

      注:假设名称空间和生命区域定义了相同的名称。如果试图使用using声明将名称空间的名称导入该声明区域,则这两个名称将发生冲突,从而出错。如果使用using编译指令导入,则局部版本将隐藏名称空间版本。所以,一般来说,使用using声明比使用using编译指令更安全。

      提倡写法是这样的:

2)名称空间的其他特性

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/16.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/17.jpg

3)未命名的名称空间=链接性为内部的静态变量

namespace

{

    int ice;

    int bandycoot;
}

C++标准不赞成在名称空间和全局作用域中使用关键字static,因此,一般提倡下面这样的转换:

4)范例:

文件1

文件2

文件3

5)名称空间及前途

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091001/18.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值