关于c_str()返回值类型的问题?

FlashMovie 2003-09-12 11:50:57
string s1 = "hello";
const char *str = s1.c_str();
c_str()返回了一个指向常量数组的指针,C++为什么让c_str()返回一个指向常量数组的指针,而不是返回一个指向数组的指针?
请高手指点,谢谢!
...全文
168 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2003-09-13
  • 打赏
  • 举报
回复
如果返回一个指向数组的指针,那么你就可以直接操作string中保存内容的字符缓冲,也就绕过了string的共用接口,这不符合面向对象中“封装”的理念。
事实上,使用强制转换,是可以达到目的的。但不要忘记这还不仅仅是个“理念”的问题,还可能产生许多具体的问题,请楼主比较一下程序中前后两段的结果的不同,并想想为什么?^_^

#include <iostream>
#include <string>
using namespace std;

void main()
{
string s1 = "abcdefg";
s1 = s1.substr(0 , 3);
cout << s1 << " " << s1.size() << endl;

string s2 = "abcdefg";
char * p = (char *)s2.c_str();
p[3] = '\0';
cout << s2 << " " << s2.size() << endl;
}

============================================================
由此可见,既然是面向对象,当然应该通过类的共用接口来操纵对象。
robbie24 2003-09-13
  • 打赏
  • 举报
回复
要回答这个问题,你先想想class的信息隐藏机制是为了什么?
若是如此的方式能够编译通过:
char *str=s1.c_str();
那么,对于class的设计者来说,将低层的那个指向动态分配所的的指针变量放在private或者protected域中对其进行信息保护/隐藏的目的将遭受挫败.
一个简单的str指针变量将与对象s1的低层指针指向同块内存.而更加可怕的事情是,它没有const修饰,那么一旦拥有了它,就意味着你可以饶过string class所设计的'重重保护',对那块可怜的内存为所欲为.
这个就是所谓的'存取晋级'.
如果你正在阅读C++ Primer 的话,那么书上关于这个问题是有描述的.
给你的忠告就是没事别胡乱传会一个低层数据成员的handle.

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧