学学习网 手机版

学学习网

学习路径: 学习首页 > 应用开发 > c++ >

第七节 模板(Templates)(5)

设置字体:
----------------------------------

别名定义(alias definition)
我们以可以为已经存在的名空间定义别名,格式为:
namespace new_name = current_name ;
标准名空间(Namespace std)
我们能够找到的关于名空间的最好的例子就是标准C++ 函数库本身。如ANSI C++ 标准定义,标准C++库中的所有类、对象和函数都是定义在名空间std下面的。
你可能已经注意到,我们在这个教程中全部忽略了这一点。作者决定这么做是因为这条规则几乎和ANSI 标准本身一样年轻 (1997) ,许多老一点的编译器并不兼容这条规则。
几乎所有的编译器,即使是那些与ANSI 标准兼容的编译器,都允许使用传统的头文件 (如iostream.h, stdlib.h, 等等),就像我们在这个教程中所使用的一样。然而,ANSI标准完全重新设计了这些函数库,利用了模板功能,而且遵循了这条规则将所有的函数和变量定义在了名空间std下。
该标准为这些头文件定义了新的名字,对针对C++的文件基本上是使用同样的名字,但没有.h的扩展名,例如, iostream.h 变成了iostream。
如果我们使用ANSI-C++ 兼容的包含文件,我们必须记住所有的函数、类和对象是定义在名空间 std 下面的,例如:
    // ANSI-C++ compliant hello world
    #include <iostream>
   
    int main () {
        std::cout << "Hello world in ANSI-C++\n";
        return 0;
    }  
                      
Hello world in ANSI-C++
更常用的方法是使用using namespace ,这样我们就不必在所有标准空间中定义的函数或对象前面总是使用范围操作符::了 :
    // ANSI-C++ compliant hello world (II)
    #include <iostream>
    using namespace std;
   
    int main () {
        cout << "Hello world in ANSI-C++\n";
        return 0;
    }   
                      
Hello world in ANSI-C++
对于STL 用户,强烈建议使用ANSI-compliant 方式来包含标准函数库。
5.3 出错处理 (Exception handling)
本节介绍的出错处理是ANSI-C++ 标准引入的新功能。如果你使用的C++ 编译器不兼容这个标准,则你可能无法使用这些功能。
在编程过程中,很多时候我们是无法确定一段代码是否总是能够正常工作的,或者因为程序访问了并不存在的资源,或者由于一些变量超出了预期的范围,等等。
这些情况我们统称为出错(例外),C++ 新近引入的三种操作符能够帮助我们处理这些出错情况: try, throw 和 catch 。
它们的一般用法是:
        try {
            // code to be tried
            throw exception;
        }
        catch (type  exception)
       {

            // code to be executed in case of exception
        }
它们所进行的操作是:
  • try 语句块中的代码被正常执行。如果有例外发生,代码必须使用关键字throw 和一个参数来扔出一个例外。这个参数可以是任何有效的数据类型,它的类型反映了例外的特征。
  • 如果有例外发生,也就是说在try 语句块中有一个throw 指令被执行了,则catch 语句块会被执行,用来接收throw传来的例外参数。
例如:
    // exceptions
    #include <iostream.h>
   
    int main () {
        char myarray[10];
        try {
            for (int n=0; n<=10; n++) {
                if (n>9) throw "Out of range";
                myarray[n]='z';
            }
        } catch (char * str) {
            cout << "Exception: " << str << endl;
        }
        return 0;
    }  
              
Exception: Out of range
在这个例子中,如果在n 循环中,n 变的大于9 了,则仍出一个例外,因为数组 myarray[n] 在这种情况下会指向一个无效的内存地址。当throw 被执行的时候,try 语句块立即被停止执行,在try 语句块中生成的所有对象会被销毁。此后,控制权被传递给相应的catch 语句块(上面的例子中即执行仅有的一个catch)。最后程序紧跟着catch 语句块继续向下执行,在上面的例子中就是执行 return 0;.
----------------------------------
课程列表
重点难点
赞助链接