第三次作业

第三次作业

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();
  
}
posted @ 2019-09-25 16:46  秦昌铭  阅读(207)  评论(1编辑  收藏  举报