c++的 程序实体 作用域 名空间 变量生存期概念理解

变量按定义的位置分为局部变量(复合语句中定义)和全局变量(函数外部定义);

  程序是由一些程序实体的定义组成,这里的程序实体包括:变量,常量,函数,类,对象以及语句标号等;

  c++根据程序的结构和标示符的定义位置,为每一个定义了的标示符规定了一个作用域。这个作用域(scope)是指一个标示符在程序文本中的有效范围,即该标示符所标识的程序实体能被访问的程序段;

c++的把标示符的作用域分成几类

  1.局部作用域:(在函数定义或复合语句中,从标示符定义点到函数定义或复合语句结束之间的程序段)(局部常量名,局部变量名/对象名,函数形参名)

  2.全局作用域: (c++程序的所有源文件内可用)(具有全局作用域的标示符叫全局标示符)(全局变量名/对象名,全局函数名,全局类名)(使用全局标识符时,若该标识符的定义点在使用点之后,则需要使用前声明它们)(c++一般吧全局标识符的声明放在.h文件中,在需要使用这些全局标识符的源文件中用#include编译预处理命令把声明文件包含进来。所以头文件中一般不能包含变量定义,以免多个源文件引用头文件时候,出现多重全局标示符定义错误)

  3.文件作用域:(指单个源文件能访问)(包含:(1.加static修饰符的全局标识符) (2.用const定义的全局常量名))

  4.函数作用域:(与局部作用域区别:函数作用域包括整个函数,局部作用域:从定义点开始到函数定义或者复合语句结束)

  5.函数原型作用域:(用于函数声明的函数原型)

  6.名空间作用域:(名空间:给一组全局程序实体定义一个名字,以免名字冲突)(域解析符:(‘::’))

  7.类作用域:(略)

  c++程序实体的生存期与标示符的作用域相关,但他们又是不同的概念。标示符作用域是一个静态的概念,它涉及的是程序的静态文本;而生存期是一个动态概念,它描述程序运行时程序实体的存在(占有内存空间)的时间段;例如(对于static存储类局部变量,其作用域是:定义它的函数中,而它的生存期为:整个程序的运行期间)

变量的生存期(程序运行时一个变量占有内存空间的时间段(lifetime))

  1.静态生存期: (它们的内存空间从程序开始执行就进行分配,直到程序结束才收回它们的空间)(1.全局变量,2.定义为static存储类的局部变量(只是在第一次进入函数时候初始化一次,后面再进入此函数就不会被重新初始化)(作用:能在函数调用时候获得上一次调用结束时该局部变量的值 (这个作用用全局变量也能达到,但是static存储类的局部变量的作用域只是在该函数中,收到函数封装的保护) )

  PS:[c++中的关键词static有两个不同含义:(在全局标识符的定义中——把全局标示符的作用域改变为文件作用域)(在局部变量定义中——指出相应的局部变量具有静态生存期)]

  2.自动生存期: (程序执行到定义它们的复合语句(包括函数体)时才分配,复合语句执行结束时,空间被收回)(局部变量,函数形参

  3.动态生存期 : (new,malloc来分配,手动用delete或者free回收内存空间)

程序运行时空间的分配

  1:静态数据区 (初始化后的全局变量,初始化后的static存储类的局部变量

  2:还有一个BSS区(未初始化的全局变量和静态变量存在这里)

  3:代码区 (程序的指令)

  4:栈区 (局部变量,函数的形式参数,以及函数调用时有关信息(如函数返回地址))

  5 : 堆区(new,delete变量)

  6:文字常量区 (存储全局常量,常量字符串就是放在这里的) char* r = "hello world";r指向文字常量区;但char[] b = "hello world";"hello world"存在栈区;

  还有一个问题,就是字面常量存储在哪?取址取的是哪个地方的?:有一种说法是,字面常量存储在文字常量去 

总结一些很很简单的概念,平常老是忘,记在这里以便想不清楚时来看看。

参考自:《程序设计教程-用c++语言编程》陈家俊 郑涛编著

面试题:

static的作用:

这个简单的问题很少有人能回答完全。在 C 语言中,关键字 static 有三个明显的作用:

1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数

_________________________________________________________________________________________________________

96. 关键字 const 是什么含意?

我只要一听到被面试者说:“ const 意味着常数”,我就知道我正在和一个业余者打交道。去年 Dan Saks 已经在他的文章里完全概括了 const 的所有用法,因此 ESP( 译者: Embedded Systems Programming) 的每一位读者应该非常熟悉 const 能做什么和不能做什么 . 如果你从没有读到那篇文章,只要能说出 const 意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下 Saks 的文章吧。)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

int A::f(const char* pt)const;成员const函数,不修改对象的数据区,切本函数只能调用类的const函数;

const A& f(const A&)const;返回的引用不能修改

A& f(const A&)const;返回值引用,切引用可以修改

前两个的作用是一样, a 是一个常整型数。第三个意味着 a 是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思 a 是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着 a 是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const ,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字 const 呢?我也如下的几下理由:

1). 关键字 const 的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用 const 的程序员很少会留下的垃圾让别人来清理的。)

2). 通过给优化器一些附加的信息,使用关键字 const 也许能产生更紧凑的代码。

3). 合理地使用关键字 const 可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少 bug 的出现。

————————

bit:位(0,1)

byte:字节(8bit)

int:4byte,32bit;int和机器的字长有关,其实是编译器决定的,一般的32位机子,

int型长度不仅与具体的CPU架构有关,而且与编译器有关。
int型长度的确定有三个准则:
① C/C++规定int字长和机器字长相同;

② 操作系统字长和机器字长未必一致;(前者小于等于后者)

编译器根据操作系统字长来定义int字长;
这个长度跟机器的地址总线有关,16位 int 2字节;32位int 4字节; 64位int 4字节;

不错,补充下,在32,64位上,INT型都是4个字节;

16位机器上INT是两个字节,int(-32768-+32767)

16位机器上unsigned int 也是两个字节,unsigned int(0-65535)

整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的数据,比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。同时在相同位数的情况下,所能表达的整数范围变大。另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int。
 

原文地址:https://www.cnblogs.com/springbarley/p/2390236.html