C语言中我们也是接触过作用域的,例如在函数内部就是函数的作用域,C++中丰富了作用域的内容。
总结:
1.C++中作用域主要划分为下:
- 全局作用域 名字空间域(namespace)
- 局部作用域即块作用域(函数内部或代码块)
- 类域(class)
作用域的作用:某一个对象或者变量只在其作用域内起作用
。
2.数字隐藏:不同作用域中定义了
相同名称的变量,其值不是覆盖,而是存储在不同的地址下,根据作用域查找使用
- 在不同的作用域可以定义多个相同名字的变量
- 内部的变量会隐藏外部的变量,(从内->外查找)当局部未定义,向上就近使用同名变量
不是刻意写出来的,可能会带来隐患
1. 不同作用域下,变量值的变化
先看一段代码,在main()的内外都定义了n,这样会不会有问题呢?
#include <iostream>
int n = 6;
int main(int argc, char* argv[])
{
int n = 5;
return 0;
}
运行结果:此时n
的值未赋值(可能是由于同时定义,不知道如何取值),进入函数作用域完成赋值后,n=5
将main函数中的n注释之后,n在同样的位置,值为6
我们知道n在程序中存在于两个作用域,一个是main函数,一个是全局作用域。
#include <iostream>
int n = 6;//全局变量,全局域
int main(int argc, char* argv[])
{
int n = 5;//main函数的局部变量,局部作用域
//块作用域
{
int n = 7;
}
return 0;
}
运行过程中n值的变化
2. 作用域影响下的数据隐藏
数据隐藏:在不同的作用域可以定义多个相同名字的变量
。
2.1 数据隐藏的本质
不同作用域中定义了
相同名称的变量,其值不是覆盖,而是存储在不同的地址下,根据作用域查找使用
#include <iostream>
int n = 6;//全局变量,全局域
int main(int argc, char* argv[])
{
int n = 5;//main函数的局部变量,局部作用域
//块作用域
{
int n = 7;
printf("%d", n);
}
return 0;
}
运行结果:
2.2 变量的查找规则
内部的变量会隐藏外部的变量,(从内->外查找)当局部未定义,向上就近使用同名变量
。
#include <iostream>
int n = 6;//全局变量,全局域
int main(int argc, char* argv[])
{
int n = 5;//main函数的局部变量,局部作用域
//块作用域
{
//int n = 7;
printf("%d", n);
}
return 0;
}
#include <iostream>
int n = 6;//全局变量,全局域
int main(int argc, char* argv[])
{
//int n = 5;//main函数的局部变量,局部作用域
//块作用域
{
//int n = 7;
printf("%d", n);
}
return 0;
}
3. 学习视频地址:C++57个入门知识点_09_ 作用域与数据隐藏