第三次作业
第三次作业
1.什么是作用域:
作用域通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。对于对象而言(其他也是一样的),在main函数中,对象的作用域为他所在的最近的一对花括号内。在后花括号处析构函数析构函数被调用;全局的对象的作用域为声明之后的整个文件,析构函数在最后被调用。另外,临时产生的对象在使用完后立即会被析构。
2.作用域的例子
#include <iostream>
using namespace std;
int main(){
int i;
int j;
i=j=1;
{
i=2;
cout<<"i="<<i<<endl;//这里显示i的值为2
j=4;
cout<<"j="<<j<<endl;//这里显示j的值为4
}
cout<<"i="<<i<<endl;//这里显示i的值为1
cout<<"j="<<j<<endl;//这里显示j的值为1
return 0;
}
//运行后的结果为
//. i=2
//. j=4
//. i=1
//. j=1;
3.名称空间
名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关键字“namespace”,使用名字空间时用符号“::”指定。
声明区域:声明区域是可以在其中进行声明的区域。例如可以在函数外面声明全局变量,对于这种变量,其声明区域为其声明所在文件。对于在函数中声明的变量,其声明区域为其生命所在的代码块。
潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾,因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。
C++关于全局变量和局部变量的规则定义了一种名称空间层次。每个声明区域都可以声明名称,这些名称独立于在其他声明区域中声明的名称。
名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此在默认情况下,在名称空间中声明的名称的链接性为外部的(除非它引用了常量)。
任何名称空间中的名称都不会与其他名称空间中的名称发生冲突。
#include <iostream>
using namespace std;
namespace acb{
int i;
float j;
}
void fun();
int main(){
using std::cout;
using std::endl;
acb::i=3;
acb::j=1.3;
cout<<"i="<<i<<endl;
cout<<"j="<<j<<endl;
return 0;
}
3.using
using 声明和using 编译指令
using声明使特定的标识符可是==可用,using编译指令使整个名称空间可用。
using声明由被限定的名称和它前面的关键字using组成,如:using acb::i;
using声明将特定的名称添加到它所属的声明区域中。
4.可以使用别名
可以给名称空间创建别名
例如:
namespace my_very_favorite_things {.......}
则可以使用下面的语句将mvft成为my_very_favorite_things的别名:
namespace mvft = my_very_favorite_things;
5.名称空间可以无名字没有名字的名字空间
名字空间的名字也可以省略,称之为“无名名字空间”,无名名字空间经常被使用,其作用是“内部可以引用,而外部不能引用。”
6.关键字using可以帮助从namespace中引入名字到当前的声明区域
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main () {
using first::x;
using second::y;
cout << x << endl;
cout << y << endl;
cout << first::y << endl;
cout << second::x << endl;
return 0;
}
输出是
5
2.7183
10
3.1416
就如我们所指定的第一个x是first::x,y是second.y
7.using也可以导入整个的namespace
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main () {
using namespace first;
cout << x << endl;
cout << y << endl;
cout << second::x << endl;
cout << second::y << endl;
return 0;
}
8.在头文件中,我们通常坚持使用显式的限定,并且仅将using指令局限在很小的作用域中,这样他们的效用就会受到限制并且易于使用。类似的例子有
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
}
namespace second
{
double x = 3.1416;
}
int main () {
{
using namespace first;
cout << x << endl;
}
{
using namespace second;
cout << x << endl;
}
return 0;
}
8.namespace也支持嵌套
#include <iostream>
namespace first
{
int a=10;
int b=20;
namespace second
{
double a=1.02;
double b=5.002;
void hello();
}
void second::hello()
{
std::cout <<"hello world"<<std::endl;
}
}
int main()
{
using namespace first;
std::cout<<second::a<<std::endl;
second::hello();
}