C++学习-存储的持续性与作用域

来源:互联网 发布:java web的区别 编辑:程序博客网 时间:2024/06/07 01:52

  • 自动存储
  • 函数存储
  • 静态存储
  • 类作用域

自动存储

  • 在默认情况下,在函数中声明的函数参数和变量存储类型为auto,作用域为局部。
  • 如果在代码块中定义了变量,则该变量的存在时间和作用域被为代码块
  • 在函数体内部代码块中声明与代码块外部名称相同变量时,程序执行到代码块内部时将该变量解释为局部代码块变量,新的定义隐藏了旧的定义。程序离开代码块时,原来的定义重新可见
  • 全局声明的auto变量具有外部链接性,两个源文件中不能声明同名称的全局auto变量
  • 使用extern关键字引用同名外部变量

    //1.cppint t = 5;int main(){    ...}//2.cppextren int t;//t = 5
    • 注意: extern int t = 1 等效于声明赋值语句
    • 实际上,使用extern链接的外部变量是与原变量相同地址的一样的变量

函数存储

  • 函数的默认为静态存储,具有外部链接性。static可将函数的链接性设置为内部,在其他源文件中可声明并定义同名函数
  • 在定义了静态函数的文件中,静态函数的定义将覆盖全局函数的定义。即使在文件外部有同名函数仍使用静态版本。
  • 内联函数不受该规则限制,在头文件中声明内联函数,包含头文件的每个文件都会具有内联函数的定义。

静态存储

  • 使用static关键字声明的变量为静态存储变量
  • 全局声明的静态变量不具有外部连接性,若其他源文件有同名自动变量,在使用时静态变量的定义将覆盖自动变量
  • 静态变量的作用域与自动变量相同,但在程序运行时一直存在。在函数体内声明的静态变量声明赋值语句只会执行一次
  • 使用作用域解析运算符 :: 放在变量前面时,将使用变量的全局版本

类作用域

  • 在类中定义的函数和变量作用域为整个类。因此可以在不同类中使用相同的类成员名
  • 类作用域意味着不能从外部直接访问类成员,必须通过对象访问
  • 在类外定义类成员函数时需要加上作用解析运算符(如void Ch::test(int b))
  • 访问类指针成员时须使用间接成员运算符(->)
  • 在类声明中不能直接定义整型常量,在类定义未声明时并不能为常量开辟储存空间。解决方法为

    class a{public:    enum{yellow = 10};...}

    这种方式不会创建类成员,类中的对象不包含枚举。yellow是符号名称,在类中,编译器会用12替代yellow。

    • 使用关键字static const

      class a{public:static const yellow = 12;...}

    这种方式会创建静态类成员,但其存储在静态存储区中而非对象中

阅读全文
0 0