C++(一)变量的作用域和生命周期

C++(一)变量的作用域和生命周期

1.全局变量与局部变量

1.1 定义变量
定义变量:让编译器为变量分配存储空间。
——在定义变量后,变量代表这一块存储空间,在一个程序中变量只能被定义一次

在函数体外定义的变量为全局变量,默认以0进行初始化或者按照默认构造函数进行初始化;
在函数体或语句块内部定义的变量称为局部变量,必须手动初始化(如果没有初始化会带来风险)。
——不论是全局变量还是局部变量,不论是内置类型还是类类型,都建议在定义时手动初始化

1.2 声明变量
只对全局变量进行声明,不可对局部变量进行声明。(若对局部变量声明,相当于对局部变量进行定义但是没有初始化)
——若单纯对全局变量进行声明,作用域为整个文件;若用extern对全局变量进行声明(如: extern int a),只要其他文件include该文件,作用域就得到了扩展。
——在函数体外,int a是定义全局变量,并且默认初始化;extern int a是声明;extern int a = 100是定义。
——在函数体内,int a是定义局部变量,并且未默认初始化,将屏蔽掉同名的全局变量;extern int a是声明全局变量,并且不能含有初始化式(在局部作用域不可能定义全局变量)

1.3 生命周期
全局变量:整个程序的运行过程,进程一被创建就存在。
——未手动初始化(即默认初始化)的全局变量在内存中位于.bss段;已手动初始化的全局变量在内存中位于.data段。进程结束后被释放
局部变量:从执行到位于局部变量作用域的指令开始,到执行完作用域的指令时结束。
——局部变量存储在栈中。只有该局部变量所在的函数被调用时,局部变量才被压入栈。

1.4 关键字
const/static/extern
1.4.1 extern
1.2中所述

1.4. 2 static
修饰局部变量时,作用域不变,生命周期变为整个进程。静态局部变量存放在静态存储区(.data/.bss)中。
——静态局部变量的初始化语句只有第一次调用该函数时才有效。如果不是第一次调用,那么将忽略初始化;
——修饰全局变量时,限定全局变量的作用域在本文件中(抵消extern的作用?);
——修饰函数时,与全局变量相同。

1.4. 2 const
const修饰的变量必须被初始化,在定义后不可更改

总而言之,static修饰的全局/局部变量都存储在静态存储区(.data/.bss)中,const修饰的全局变量在只读数据段,局部变量位于栈中。

2 public/protected/private

2.1 基本规则
类的一个特征是封装,public和private主要用于实现这一目的。用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元进行访问。

类的另一个特征是继承,protected主要用于实现这一目的。protected成员可以被派生类对象访问,不能被用户代码(类外)访问。

2.2 针对继承的规则
继承同样有三种方式:public,protected和private。
public继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变为:public,protected,private;
protected继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变为:protected,protected,private;
private继承:基类成员的访问属性在派生类中分别变为:private,private,private。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值