C++ 字符串

     C++ 中字符串的问题,有如下两段代码:

     代码一:

       

     代码二:

      

     编译后发现,代码一可以通过编译,而代码二却会报错。在gcc中报错为:

       

     

     原来在C++中,字符串常量(像"Hello")不是std::string类型,而是字符数组,或者说是C风格的字符串。所以对于代码二

     const std::string message = "Hello" + ", world" + exclam;

这行来说,编译器是这样解释的:

     const std::string message = const char[6] + const char[8] + std::string;

由于"+"是左结合性的,所以上句相当于:

     const std::string message = ((const char[6] + const char[8]) + std::string);

也就是先计算最左边的加法,所得结果再传给右边的加法。所以编译器试着去计算const char[6] + const char[8]但是并没有为数组定义这样的加法(即没有为数组重载加法运算符)。虽然数组被隐式的转换为指针,但是const char* + const char*也并不能帮组编译器,因为同样没有为两个指针之间定义加法运算。

     这时候,编译器并不知道你想把结果转换为std::string类型。

     而代码一之所以能够通过编译是因为这时候编译器看到的运算是:

     std::string + const char[8] + const char[2]

在这里,第一个加法被转换为 std::string + const char*这样的一个加法运算是已定义了的,返回类型为 std::string。所以编译器能成功地计算出第一个加法,并且结果是一个字符串,这时候第二个加法就变成了 std::string + const char[2],和之前一样,先被转换为 std::string + const char*,编译器可以成功的运算并再次返回std::string类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值