命名空间
c++中有命名空间的概念,不过貌似用的不多,但是也不可缺少,这里就记录一下最常用的情况吧。之前所有的代码中都有using namespace std;这一句话,就是说我们的代码和std命名空间是在同一个空间的,空间的概念,其实就是一个容器,我们将类,函数等都存放在容器中的,所以,我们可以定义多个容器,这多个容器之间是互不影响的。之所以我们的代码中都有std命名空间,那是因为,C++所有的库函数都是声明在std标准命名空间中的,因此要调用的话,我们的代码也需要在std空间。
我们以最简单的helloworld程序为例,编译如下代码,因为该代码不存在于标准的命令空间中,所以我们是无法调用标准库函数的。
#include <iostream>
int main()
{
cout << "helloworld" << endl;
return 0;
}
编译报错后的结果显而易见了。
--------------------Configuration: ExceptionStudy - Win32 Debug--------------------
Compiling...
Main1.cpp
D:\CPLUSPLUSPROJECTS\ExceptionStudy\Main1.cpp(5) : error C2065: 'cout' : undeclared identifier
D:\CPLUSPLUSPROJECTS\ExceptionStudy\Main1.cpp(5) : error C2297: '<<' : illegal, right operand has type 'char [11]'
D:\CPLUSPLUSPROJECTS\ExceptionStudy\Main1.cpp(5) : error C2065: 'endl' : undeclared identifier
执行 cl.exe 时出错.
Main1.obj - 1 error(s), 0 warning(s)
提示cout << endl;均无法找到相关标识符。只要在main函数上加入using namespace std即可。
异常
看看c++中的异常吧。c++异常其实和java异常一样,都是标准的try{}catch(){}结构。我们在try语句块中执行可能会出错的代码,并且根据出错的情况throw出对应的异常。然后在catch()中捕捉这个异常的类型,并在catch(){}代码块中执行错误处理。举个最简单的例子。
#include <iostream>
using namespace std;
int main()
{
int i = 1;
if(sizeof(i) == 4)
try{
throw i;
}catch(int j){
cout << "exception : " << j << endl;
}catch(...){
cout << "Exception..." << endl;
}
return 0;
}
先说下代码执行后的结果。
这里我们仅仅在try语句块中抛出这个异常,然后在catch语句中捕捉并处理,处理的语句很简单,就是打印。呵呵。
再看看后面这一句catch(...) catch的类型是三个点号,由于一段代码可能会抛出各种错误,所以catch语句会很多,因此出现捕捉三个点号的情况,这个语法主要是想说明三个点号可以代替所有的类型,如果catch语句太多的话,那么只用捕捉点号就好了,这样能捕捉到所有的异常类型。
还有一种情况,如果所有的catch语句都没有捕捉到抛出的类型,那么程序会终止,系统会调用相关的库函数来终止当前的上下文。