作用域定义:作用域是一个标识符在程序正文中有效的区域。在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 }
运行结果如上
原文:https://www.cnblogs.com/jianW1024/p/11610176.html