域与对象的生命周期

域与对象的生命周期

域的概念

域 (scope) 表示了程序中的一部分,其中的名称有唯一的含义
● 全局域( global scope ):程序最外围的域,其中定义的是全局对象
● 块域( block scope ),使用大括号所限定的域,其中定义的是局部对象
● 还存在其它的域:类域,名字空间域……

本质特征: 表示程序中名称具有唯一含义的部分区域,可包含变量、函数、类型别名等各类名称定义
核心作用: 解决名称冲突问题,例如在不同函数中定义同名变量int x=3不会产生重复定义错误
典型示例: 全局域中的x=3与函数域中的x=3属于不同实体,编译器通过域区分其存储空间

namespace MyNS{ //名字空间域
	int x = 3;
	void fun(){ } //名字空间域中的函数
	using MyInt = int; //名字空间域中的类型别名
}
using MyInt = float; //全局域中定义的类型别名
int x = 3; //全局域
void func(){ //全局域中的函数
	int x = 3;
}
int main(){
	int x = 3;
}

● 域可以嵌套,嵌套域中定义的名称可以隐藏外部域中定义的名称

int x = 3;
int main(){
	int x = 3; //局部域变量把全局域的同名称变量隐藏了
	std::cout << x << '\n'; //打印局部域变量
}

对象的生命周期

● 对象的生命周期起始于被初始化的时刻,终止于被销毁的时刻
● 通常来说
– 全局对象的生命周期是整个程序的运行期间
– 局部对象生命周期起源于对象的初始化位置,终止于所在域被执行完成

int x = 4; //全局对象
int main(){ 
	int x = 3; //局部对象
	{
		std::cout << x << '\n'; // x输出3
		int x = 5; //局部对象
		std::cout << x << '\n'; // x输出5
	}// x = 5的对象被销毁
}// x = 3的对象被销毁
#include<iostream>
using namespace std;

void useLocal();
void useStaticLocal();
void useGlobal();

int x{1}; //global variable

int main() {
    cout << "global x in main is " << x << '\n'; // 1
    const int x{5}; //local variable to main
    cout << "local x in main's outer scope is " << x << '\n'; // 5
    { //block starts a new scope
        const int x{7};
        cout << "local x in main's inner scope is " << x << '\n'; //7
    }//7被销毁
    useLocal(); //25,26
    useStaticLocal(); //50,51
    useGlobal(); //1,10
    useLocal(); //25,26
    useStaticLocal(); //51,52
    useGlobal(); //10,100
    cout << "\nlocal x in main is " << x << '\n'; //5
    return 0;
}

void useLocal(){
    int x{25};
    cout << "\nlocal x is " << x << " on entering useLocal\n"; //25
    ++x;
    cout << "local x is " << x << " on exiting useLocal\n"; //26
}

void useStaticLocal(){
    static int x{50}; //静态x被创建
    cout << "\nlocal static x is " << x << " on entering useStaticLocal\n"; //50
    ++x;
    cout << "local x is " << x << " on exiting useStaticLocal\n"; //51
} //静态x未被销毁

void useGlobal(){
    cout << "\nglobal x is " << x << " on entering useGlobal\n"; //1
    x *= 10;
    cout << "global x is " << x << " on exiting useGlobal\n"; //10
}

最小特权原则,这是良好软件工程的基本准则。该原则指出:代码应仅被授予完成其指定任务所需的特权和访问权限,而不应更多
局部变量的作用域就是一个例子:当不需要时,它不应可见。
局部变量在函数被调用时创建,在函数执行期间使用,函数返回时销毁
最小特权原则通过防止代码意外(或恶意)修改不可访问的变量值,使程序更健壮,同时也使程序更易于阅读和维护。
通常,变量应声明在其需要被访问的最窄作用域中。仅在特定函数中使用的变量应声明为该函数的局部变量,而非全局变量。

下图来自:内存五大区:(栈、堆、全局静态区、常量区、代码区)(线程、函数栈、栈帧)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Uncertainty!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值