设为首页 加入收藏

TOP

3.5.5 与旧代码的接口
2013-10-07 16:28:13 来源: 作者: 【 】 浏览:88
Tags:3.5.5 代码 接口

3.5.5  与旧代码的接口

很多C++(www.cppentry.com)程序在标准库出现之前就已经写成了,它们肯定没用到string和vector类型。而且,有一些C++(www.cppentry.com)程序实际上是与C语言或其他语言的接口程序,当然也无法使用C++(www.cppentry.com)标准库。因此,现代的C++(www.cppentry.com)程序不得不与那些充满了数组和/或C风格字符串的代码衔接,为了使这一工作简单易行,C++(www.cppentry.com)专门提供了一组功能。

混用string对象和C风格字符串

3.2.1节(第84页)介绍过允许使用字符串字面值来初始化string对象:

  1. string s("Hello World"); // s的内容是Hello World  

更一般的情况是,任何出现字符串字面值的地方都可以用以空字符结束的字符数组来替代:

允许使用以空字符结束的字符数组来初始化string对象或为string对象赋值。

在string对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象(不能两个运算对象都是);在string对象的复合赋值运算中允许使用以空字符结束的字符数组作为右侧的运算对象。

上述性质反过来就不成立了:如果程序的某处需要一个C风格字符串,无法直接用string对象来代替它。例如,不能用string对象直接初始化指向字符的指针。为了完成该功能,string专门提供了一个名为c_str的成员函数:

  1. char *sstr = s; // 错误:不能用string对象初始化char*  
  2. const char *sstr = s.c_str(); // 正确  

顾名思义,c_str函数的返回值是一个C风格的字符串。也就是说,函数的返回结果是一个指针,该指针指向一个以空字符结束的字符数组,而这个数组所存的数据恰好与那个string对象的一样。结果指针的类型是const char*,从而确保我们不会改变字符数组的内容。

我们无法保证c_str函数返回的数组一直有效,事实上,如果后续的操作改变了s的值就可能让之前返回的数组失去效用。

如果执行完c_str()函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。

使用数组初始化vector对象

3.5.1节(第114页)介绍过不允许使用一个数组为另一个内置类型的数组赋初值,也不允许使用vector对象初始化数组。相反的,允许使用数组来初始化vector对象。要实现这一目的,只需指明要拷贝区域的首元素地址和尾后地址就可以了:

  1. int int_arr[] = {0, 1, 2, 3, 4, 5};  
  2. // ivec有6个元素,分别是int_arr中对应元素的副本  
  3. vector<int> ivec(begin(int_arr), end(int_arr));  

在上述代码中,用于创建ivec的两个指针实际上指明了用来初始化的值在数组int_arr中的位置,其中第二个指针应指向待拷贝区域尾元素的下一位置。此例中,使用标准库函数begin和end(参见3.5.3节,第118页)来分别计算int_arr的首指针和尾后指针。在最终的结果中,ivec将包含6个元素,它们的次序和值都与数组int_arr完全一样。

用于初始化vector对象的值也可能仅是数组的一部分:

  1. // 拷贝三个元素:int_arr[1]、int_arr[2]、int_arr[3]  
  2. vector<int> subVec(int_arr + 1, int_arr + 4);  

这条初始化语句用3个元素创建了对象subVec,3个元素的值分别来自int_arr[1]、int_arr[2]和int_arr[3]。

建议:尽量使用标准库类型而非数组

使用指针和数组很容易出错。一部分原因是概念上的问题:指针常用于底层操作,因此容易引发一些与烦琐细节有关的错误。其他问题则源于语法错误,特别是声明指针时的语法错误。

现代的C++(www.cppentry.com)程序应当尽量使用vector和迭代器,避免使用内置数组和指针;应该尽量使用string,避免使用C风格的基于数组的字符串。

3.5.5节练习

练习3.41:编写一段程序,用整型数组初始化一个vector对象。

练习3.42:编写一段程序,将含有整数元素的vector对象拷贝给一个整型数组。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.5.4 C风格字符串 下一篇3.6 多维数组(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: