一、全局变量

    全局变量也称为外部变量,是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,应该做全局变量说明。只有在函数内经过说明的全局变量才能使用。但在一个函数之前定义的全局变量,在该函数内使用可以不再加以说明。

问题:如何在不同文件中引用一个已经定义过的全局变量?

可以用引用头文件的方式,也可以用extern关键字

二、局部变量

    局部变量是指在程序中,只在特定过程和函数中可以访问的变量,是相对于全局变量而言的。在C等面向过程语言中,局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。

     有些语句允许在他们控制结构中定义变量,在语句的控制结构中定义的变量,仅在定义他们的块语句结束前有效。这种变量的作用域限制在语句体内

     在同一个文件中,当局部变量屏蔽了全局变量,而又想要使用全局变量时,有两种方法:一种是使用作用域操作符::,另一种是使用extern关键字

三、静态变量static

1.不考虑类:

    不考虑类,static的作用主要有三条:

(1)第一个作用:隐藏。

     当我们同时编译多个文件的时候,所有没有加static前缀的全局变量函数都具有全局可见性。在A.cpp中定义的全局变量和函数也可以在B.cpp被调用。如果添加了static,就会对其他源文件隐藏。利用这个特性,就可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。

    static可以作为函数和变量的前缀,对于函数讲,static的作用仅限于隐藏,对于变量将,static的作用还有(2)和(3)

(2)默认初始化为0

     包括未初始化的全局静态变量和局部静态变量。未初始化的全局变量和未初始化的全局静态变量都存储在BBS段,都是默认初始化为0.

(3)保持局部变量内容的持久

      函数内的自动(局部)变量,当调用的时候就存在,退出的时候就消失,但是静态局部变量虽然在函数内定义,但是静态局部变量始终存在着,也就是说它的生存期是整个源程序,其特点是:只进行一次初始化且具有“记忆性”。

     静态局部变量的生存周期虽然是整个源程序,但是他的作用域仍然和局部变量相同,只能在函数体内使用。退出函数之后,尽管该变量还继续存在着,但是不能使用他们。

2.考虑在类中

  static修饰的变量和函数,表明这个变量和函数属于整个类而不是属于此类的任何特定对象的变量和函数。

(1)静态成员变量  

  如果类内数据成员的声明前面加了关键字static,该数据成员就是类内的静态数据成员。通常,非static数据成员存在于类类型的每个对象中。但是,static数据成员是独立于该类的任意对象。当某个类的实例修改了静态数据成员的值的时候,其他的实例也可以看到修改之后的值。

     静态数据成员也遵从public,protected,private访问规则。和普通数据成员没有差别。

    静态数据成员存储在全局存储区。静态数据成员定义时要分配空间,所以不能在类声明中定义。static数据成员必须在类定义体外部定义。

(2)静态成员函数

   静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和静态成员函数。静态成员函数不能访问非静态成员函数和非静态数据成员,非静态成员函数可以任意地访问静态成员函数和静态数据成员。

    因为没有this指针的额外开销,所以静态成员函数与类的非静态成员函数相比速度上有提升。

四、const

(1)常量

     C++中,const限定符把一个对象转换成一个常量:const int bufSize = 512;

     因为常量在定义后就不能被修改,所以定义时必须初始化。

     在全局作用里定义非const变量时,整个程序都可以访问。在全局作用域声明const变量是定义该对象的文件的局部变量;这个变量只能在所在的文件中被访问,不能被其他文件访问。通过指定extern const就可以在整个程序中访问const对象。

(2)const指针

  指向const对象的指针:不允许使用指针来改变所指对象的值。这种情况下可以不给指针初始化。

  const指针:指针本身是一个const指针,编译器必须给一个初始值,来初始化指针。

   指针本身为const,指向的变量也是const。

(3)修饰函数和返回值

     const修饰返回值:如果函数的返回值是值类型(非指针、引用),则对于内部数据来说,返回值是否是常量并没有关系,const修饰返回值常用在处理用户定义时。

(4)const用在类中

pass

五、内存管理和释放

一个C/C++的程序,用户使用的内存主要分为以下几个部分:栈区(stack)、堆区、全局(静态)存储区、代码区。

  1. 栈:由编译器自动分配和释放,存放函数的参数值、局部变量等值。操作方式类似于数据结构中的栈。
  2. 堆:由程序员手动分配和释放,分配方式类似于链表。由malloc或者new分配,由free和delete释放。若程序员不释放,程序结束时由系统释放。
  3. 全局(静态)存储区:存放全局变量和静态变量。包括DATA段(全局初始化区)与BSS段(全局未初始化区)。其中,初始化的全局变量和静态变量存放在DATA段,未初始化的全局变量和未初始化的静态变量存放在BSS段,程序结束后由系统释放

    其中BSS段的特点是:在程序执行之前,BSS段会自动清零。所以,未初始化的全局变量和静态变量在程序执行之前的值是0.
  4. 文字常量区:常量字符串就是放在这里的。程序结束后,由系统释放
  5. 代码区:存放函数体的二进制代码。

问题1:堆和栈的区别?

    栈区是由编译器自动分配释放,存放函数的参数值,局部变量的值等。操作类似于数据结构中的栈,速度较快。

    堆区,一般由程序员分配和释放,若程序员不释放,程序结束时候由操作系统回收。它的分配方式类似于链表,速度较慢,容易产生碎片。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐