数据的共享与保护 知识梳理一

作用域:作用域是一个标识符在程序正文中有效的区域
1.函数原型作用域:在函数原型声明时形式参数的作用范围就是函数原型作用域,例如:
double area(double radius);
标识符radius的作用范围就在函数area形参列表的左右括号之间,在程序的其他地方不能引用这个标识符,因此标识符radius的作用域称作函数原型作用域
2.局部作用域:函数形参列表中形参的作用域,从形参列表中的生命处开始,到整个函数体结束之处为止 函数体声明的变量,其作用域从声明处开始,一直到声明所在的块结束的大括号为止 具有局部作用域的变量也被称为局部变量 例如:
在这里插入图片描述
3.类作用域:类可以被看成是一组有名成员的集合,类X的成员m具有类作用域,对m的访问方式有如下3种
(1)如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数可以直接访问成员m
(2)通过表达式x.m或者X::m
(3)通过ptr→m这样的表达式,其中ptr为指向X类的一个对象的指针
4.命名空间作用域
命名空间的语法形式如下:
namespace 命名空间名{
命名空间内的各种声明(函数声明,类声明……)
}
如果需要引用其他命名空间的标识符,需要使用下面的语法:
命名空间名::标识符名
例如:
namespace SomeNs{
class SomeClass{…};
};
如果需要引用类名SomeClass或函数名someFunc,需要使用下面的方式:
SomeNs::SomeClass obj1; //声明一个SomeNs::SomeClass型的对象 obj 1
为了解决在标识符前总使用这样的命名空间限定会显得过于亢长,可以使用using语句:
using 命名空间名:: 标识符名
using namespace 命名空间名;
命名空间也允许嵌套,例如:
namespace OuterNs{
namespace InnerNs{
class SomeClass{…};
}
}
作用域实例:
#include
using namespace std;
int i; //在全局命名空间中的全局变量
namespace Ns {
int j; //在Ns命名空间中的全局变量
}int main() {
i = 5; //为全局变量i赋值
Ns::j = 6; //为全局变量j赋值
{ //子块1
using namespace Ns; //使得在当前块中可以直接引用Ns命名空间的标识符
int i; //局部变量,局部作用域
i = 7;
cout << "i = " << i << endl; //输出7
cout << "j = " << j << endl; //输出6
}
cout << "i = " << i << endl; //输出5
return 0;
}
运行结果:
i = 7
j = 6
i = 5
第一次输出的结果是7,是因为具有局部作用域的变量i把具有命名空间作用域的变量i隐藏了,具有命名空间作用域的变量i变得不可见。当程序运行到块1结束后,进行第二次输出时,输出的就是具有命名空间作用域的变量i的值5
变量j也具有命名空间作用域,它被声明在命名空间Ns中,在主函数中通过Ns::j的方式引用,为其赋值,接下来在块1中,通过using namespace Ns使得该命名空间的标识符可以在该块中被直接引用,因此输出j时可以直接使用标识符j
具有命名空间作用域的变量也称为全局变量

可见性
程序运行到某一点,能够引用到的标识符,就是该处可见的标识符
在这里插入图片描述
作用域可见性的一般规则:
标识符要声明在前,引用在后
在同一作用域中,不能声明同名的标识符
在没有互相包含关系的不同的作用域中声明的同名标识符,互不影响
如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见

对象生存期包括静态生存期和动态生存期
静态生存期:如果对象的生存期与程序的运行期相同,则称它具有静态生存期 在命名空间作用域中声明的对象都是具有静态生存期的 如果要在函数内部的局部作用域中声明具有静态生存期的对象,则要使用关键字static,例如:static int i;//i是静态变量
静态变量的特点是当一个函数返回后,下一次再调用时,该变量还会保持上一回的值,即使发挥了递归调用,也不会为该变量建立新的副本,该变量会在每次调用间共享
在定义静态变量的同时也可以为它赋初值,例:
static int i = 5;
表示i会被赋予5初始化,而非每次执行函数时都将i赋值为5
动态生存期:除了上述两种情况,其余的对象都具有动态生存期 在局部作用域中声明的具有动态生存期的对象,习惯上也称为局部生存期对象 局部生存期对象诞生于声明点,结束于声明所在的块执行完毕之时
变量的生存期与可见性
#include
using namespace std;
int i = 1;
void other() {
static int a = 2;
static int b;
int c = 10;
a += 2;
i += 32;
c += 5;
cout << “OTHER” << endl;
cout << “i:”<< i << " a:"<< a << " b:"<< b << " c :"<< c << endl;
b = a;
}
int main() {
static int a;
int b = -10;
int c = 0;
cout << “MAIN” << endl;
cout << “i:” << i << " a:" << a << " b:" << b << " c:" << c << endl;
c += 8;
other();
cout << “MAIN” << endl;
cout << “i:” << i << " a:" << a << " b:" << b << " c:" << c << endl;
i += 10;
other();
return 0;
}
在这里插入图片描述
注意:static int a,static int b是静态局部变量,定义时未被指定初值的基本类型静态生存期变量,会被赋予0值初始化

类的静态成员
模块间对内存中数据的共享是通过函数与函数之间的数据共享来实现的
静态数据成员
一个类的所有对象具有相同的属性,是指属性的个数,名称,数据类型相同,各个对象的属性值则可以各不相同,这样的属性在面向对象方法中称为实例属性
类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的,将类比作一个工厂,对象是工厂生产出的产品,那么静态成员是存放在工厂中,属于工厂的,而不是属于每个产品的
静态数据成员具有静态生存期,一般用法是“类名::标识符” 在UML语言中,静态数据成员通过在数据成员下方添加下划线来表示,从下面的例子中可以看到静态数据成员的作用
例:具有静态数据成员的point类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值