`
java-mans
  • 浏览: 11431533 次
文章分类
社区版块
存档分类
最新评论

【c++ primer】第九章 内存模型和名称空间

 
阅读更多

一,单独编译

1)请不要将函数定义或变量声明放到头文件中。

原因:一个头文件中包含一个函数定义,然后其他两个文件(同属于一个程序)包含该头文件,则同一个程序中将包含同一个函数定义。除非函数是内联的(inline),否则将出错。

2)将结构放在头文件中是可以的。因为它们不创建变量。

3)头文件写法: “main.h” 头文件包含在双引号中则编译器首先查找当前的工作目录。

<main.h>包含在尖括号中则在存储标准头文件爱你的主机系统的文件系统中查找

4)源码文件:**.c 不需要#include **.c 因为这样将导致重复声明

5)预处理器编译指令 #ifndef node

#define node 23

#endif

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

1)自动存储持续性(函数定义中声明的变量)

静态存储持续性(函数定义外定义的变量和static定义的变量)

动态存储持续性(new操作符分配的变量一直存在,直到delete释放内存)

2)函数的作用域只能是整个类,或整个名称空间。不能是局部的,因为不能在函数中定义函数

3)寄存器变量(频繁使用的变量) register int i; //没有内存地址,不能将地址操作符用于寄存器变量

4)作用域解析操作符 "::"

5)extern 使用实例

file1.c:int count=1;

file2.c:

#include "stdio.h"
extern int count;
int main()
{
   printf("coutnt=%d\n",count);
   return 0;
}
6)注意:extern 声明的变量不能初始化

7)使用new 运算符 初始化变量的语句一定要 位于函数中,因为只能使用常量表达式来初始化静态存储变量

三,布局new操作符

让程序员指定要使用的位置,程序员可以使用这种特性来设置其内存管理规程或处理需要通过特定地址进行访问的硬件。

注意:要使用布局new操作符,必须添加 #include <new>

例子:

#include <new>
#include <iostream>
using namespace std;
char buff[512];
int main()
{
    double *p1,*p2;
    p1=new double[5];
    p2=new (buff)double[5];
    for(int i=0;i<5;i++)
       p1[i]=p2[i]=1000+20.0*i;
    
    cout<<"p1 address:"<<p1<<"\nbuff address:"<<(void *)buff<<endl;
    cout<<"p2 address:"<<p2<<endl;
    return 0;
}
四,名称空间

1)名称空间可以是全局的,也可以位于另一个名称空间中

2)using声明 usding std::cout //将名称添加到局部声明区域

using编译指令 using namespace std;//使名空间中,所有名称可用

3) 例子:

#include <iostream>
namespace jill{
    double  bucket(double n){return n;}
    double  fech; 
}
int main()
{
  using namespace jill;
  using std::cout;
  using std::endl;
  
  double water=bucket(2);
  fech=4;
  double fech=5;

  cout<<"water:"<<water<<endl;
  cout<<"fech:"<<fech<<endl;
  cout<<"::fech:"<<jill::fech<<endl;

}
局部的fech 将隐藏 名空间中的fech




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics