名字空间,异常与匿名函数
名字空间基础语法
定义一个名字空间,实际上就是定义一个作用域,在名字空间中可以定义变量、函数等
//ns.cpp
namespace ns
{// 在 ns 中定义变量int a = 1;// 在 ns 中定义函数float f(int x){return x/2;}
}
// ns.h
namespace ns
{// 对名字空间 ns 中的符号进行声明extern int a;extern float f(int x);
}
using的用法
// 形式一:导入整个名字空间中的所有符号
using namespace ns; // 导入名字空间:ns// 形式二:导入名字空间中的指定符号
using ns::a;
using ns::f;
名字空间的层次性
层次相同互相冲突(报错ambiguous),层次不同互相覆盖(小的作用域覆盖大的作用域)
全局作用域
int a = 0;int main()
{int a = 3;cout << "局部: " << a << endl;cout << "全局: " << ::a << endl;
}
内嵌名字空间
定义
// ns.cpp
namespace ns
{int a = 1; // 注意,此处a的全称是 ns::a// 在名字空间中嵌套另一个名字空间namespace nested_ns{int a = 2; // 注意,此处a的全称是 ns::nested_ns::aint x = 100;}
}
声明
// ns.h
namespace ns
{extern int a;namespace nested_ns{extern int a;extern int x;}
}
使用
// main.cpp
#include "ns.h"int main()
{cout << ns::a << endl;cout << ns::nested_ns::a << endl;cout << ns::nested_ns::x << endl;
}
扩展
namespace ns
{int b = 5;
}
异常的抛出和捕获
异常,即 exception,是C++中的基本概念之一,在某段程序发生无法继续正常执行的情况时,C++允许程序进行所谓抛出异常(有时也被称为吐出异常)的行为,这些被抛出的异常,会自动地从触发点开始向外传播,直到被捕获(有时也被称为吞下异常)或者程序终止。
抛出异常(throw)和捕获(catch)
throw "在这里抛出异常"
// 试图执行可能发生的异常try{r = f(a, b);}catch(const char * &e)//捕获异常,类型为发生异常的返回类型{// 发生了异常cout << e << endl;//打印异常信息break;}
对异常的捕获
#include <iostream>
using namespace std;// 一个简易除法器,返回 a ÷ b 的结果
float divider(float a, float b)
{// 当除数b为0时,抛出异常!if(b == 0)throw static_cast<string>("除数不可为零");return a/b;
}int main(void)
{float a,b;float c;// 从键盘获取被除数a和除数b,并输出结果while(1){cin >> a >> b;try{c = divider(a, b); cout << c << endl;}catch(string &e){cout << e << endl;}}return 0;
}
注意
- 异常并不是返回值,靠类型判断时哪一种类型
- 实际使用使用抛出类对象
- 遗产总是自动的向上传递