string 对象与 C 风格字符串的混用

我的主力博客:半亩方塘

所谓 C 风格的字符串即 以空字符结束的字符数组 。

下面定义了一个 string 对象:

string s("Hello World");

允许使用字符串字面值来初始化 string 对象,更一般的情况下,能够出现字符串字面值的地方都能出现以空字符结束的字符数组:

  • 允许以空字符结束的字符数组来初始化 string 对象或者为 string 对象赋值
  • 在 string 对象的加法运算中,允许其中一个 (仅仅是一个) 运算对象用以空字符结束的字符数组来替代,在 string 对象的复合赋值运算中,允许其 右侧运算对象 用以空字符结束的字符数组来替代

上述性质反过来是不成立的,即不允许用 string 对象来初始化一个以空字符结束的字符数组,在以空字符结束的字符数组作为运算对象时不允许用 string 对象来替代,例如:不能使用 string 对象直接初始化一个指向字符的指针,使用 string 对象的 c_str 函数来完成这个功能,c_str 函数的返回结果是一个指向以空字符结束的字符数组的指针,这个字符数组的内容与调用这个函数的 string 对象的内容完全一致:

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

为了更加清晰地理解 c_str() 函数的返回结果,看看以下的程序及其运行结果:

#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;

int main()
{
    string s("Hello World");  // 用字符串字面值初始化一个 string 对象
    // 调用 c_str 函数返回一个指向以空字符结束的字符数组的指针
    const char *str = s.c_str();

    for (decltype(s.size()) i = 0;   // 输出这个字符数组的内容以验证结果
        i < s.size(); ++i)
        cout << *str++;      // 解引用指针,得到指针所指元素的值后,移动指针
    cout << endl;

    return 0;
}


以上程序的运行结果为:Hello World

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值