作用域

作用域定义作用域是一个标识符在程序正文中有效的区域。在C++中分为函数原型作用域、局部作用域、类作用域和命名空间作用域。

1.函数原型作用域在函数原型声明时形参的作用范围就是函数原型作用域

如第四章类里的

Point (int xx,int yy);

  

2.局部作用域顾名思义。函数形参列表中形参的作用域从形参列表的声明处到整个函数体。

如以下代码:

void fun(int a)        //a作用域开始
{ 
    int b=a;            //b作用域开始
    cin>>b;
    if(b>0)
    {
        int c;              //c作用域开始
        ......               //c作用域结束
    }                       //b作用域结束
}                            //a作用域结束

  在第三行的时候肯定无法调用变量c(经过实验也是……)

       具有局部作用域的变量也称为局部变量。

3.类作用域类可以被看成是一组有名成员的集合,类X的成员m具有类作用域。对成员m的访问方式有三种。

(1)我们先定义一个类:

1 class Point {
2 public:
3     Point(int xx = 0, int yy = 0) {
4         x = xx;
5         y = yy;
6     }
7 private:
8     int x, y;
9 };

这个定义是正确的,很明显,函数Point实现了对类内变量x,y的调用。

即第一种调用方式:如果在X的成员函数中没有声明同名的局部作用标识符,那么该函数内可以直接访问成员m

(2)通过表达式X.m或者X::m

第一篇博文里有如下代码,用来实现操作符重载

1 struct Point {
2     int x, y;
3     Point(int x = 0, int y = 0) :x(x), y(y) {};
4 };
5 
6 ostream& operator << (ostream & out, const Point & p) {
7     out << "(" << p.x << "," << p.y << ")";//第二种调用
8     return out;
9 }

即使用了第二种调用方式

(3)通过this->

如(2)中的:

1 struct Point {
2 2     int x, y;
3 3     Point(int x = 0, int y = 0) :x(x), y(y) {};
4 4 };

其赋值可以用this->x;实现,在此不加赘述

4.命名空间作用域

命名空间的语法形式如下:

namespace 命名空间{
命名空间内的各种声明(函数声明、类声明、……)
}

需要引用类名或函数名可使用:

命名空间::类名/函数名

且允许嵌套。

引用命名空间的形式分为两种:

(1)using namespace 命名空间;

(2)using 命名空间 标识符;

第一种形式将指定命名空间内的所有标识符暴露在当前的作用域内,第二种形式使用指定的标识符

我们平时使用的“using namespace std;”即是第一种——使用了标准命名空间(stdio)

实现实验

 

下面来实现一个命名空间,以标头文件的形式放入(文件命名为“标头”):

 1 #pragma once
 2 #include<iostream>
 3 using namespace std;                           //第一种方式使用命名空间
 4 
 5 namespace space1 {                             //将命名空间命名为“space1”
 6     class Point {
 7     public:
 8         Point(int xx = 0, int yy = 0) {
 9             x = xx;
10             y = yy;
11         }
12         Point(Point& p);
13         int getX() { return x; }
14         int getY() { return y; }
15     private:
16         int x, y;
17     };
18 
19     Point::Point(Point& p) {
20         x = p.x;
21         y = p.y;
22         cout << "Calling the copy constructor" << endl;
23     }
24 
25     void fun1(Point p) {
26         cout << p.getX() << endl;
27     }
28 
29     Point fun2() {
30         Point a(1, 2);
31         return a;
32     }
33 }

下面在源文件中调用之

 1 #include<iostream>
 2 #include"标头.h"
 3 
 4 int main()
 5 {
 6     space1::Point a(4, 5);                       //第二种方式使用命名空间
 7     space1::Point b = a;
 8     std::cout << b.getX() << endl;
 9     space1::fun1(b);
10     b = space1::fun2();
11     std::cout << b.getX() << endl;
12     return 0;
13 }

 

 运行结果如上

 

posted on 2019-09-29 21:43  jianW1024  阅读(324)  评论(0编辑  收藏  举报

导航