请教关于primer中的一个问题

shockwave926 2008-03-12 06:44:50
c++ primer中有个例子看不懂,如下:
#include <iostream>
#include <assert.h>
#include <iomanip>
using namespace std;


class myString;

istream& operator>>(istream&,myString&);
ostream& operator<<(ostream&,const myString&);

class myString
{
public:
myString& operator=(const myString&);
int size(){return _size;}
char* c_str(){return _string;}
.....
private:
int _size;
char* _string;
....
};

inline myString& myString::operator =(const myString& str)
{
if(this!=&str)
{
if(_string)
delete[]_string;
_size=str._size;//问题一
_string=new char[_size+1];
strcpy(_string,str._string);
}
return *this;
}



inline istream& operator>>(istream& io,myString& s)
{
const int limit_string_size=4096;
char inBuf[limit_string_size];
io>>setw(limit_string_size)>>inBuf;
s=inBuf;
return io;
}

inline ostream& operator<<(ostream& os,myString& s)//问题二
{
return os<<s.c_str();
}


问题一:为什么用_size=str.size()会报编译错误,而用_size=str._size却没问题??
问题二:为什么<<重载的声明中的参数用const修饰,而在实现的时候用const就不行,必须去掉才会编译通过??

ps:环境windowsxp+ vc++6.0
以上都包含在一个头文件中myString.h

...全文
106 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shockwave926 2008-03-12
  • 打赏
  • 举报
回复
首先对大家表示感谢,让我又长了点知识!!thanks!
但是还是有点不懂,
为什么inline ostream& operator <<(ostream& os, const myString& s) 声明的时候有const,
而实现的时候没有用const,调用非const函数c_str()却能编译通过
jieao111 2008-03-12
  • 打赏
  • 举报
回复
1楼的意思是: size() 本身不是const 而c_str()是 const的把。。。
可是。。为什么inline ostream& operator < <(ostream& os, const myString& s) 要声明为const呢
Inhibitory 2008-03-12
  • 打赏
  • 举报
回复
inline ostream& operator < <(ostream& os,myString& s)//问题二
这个函数写为
inline ostream& operator < <(ostream& os, const myString& s) 更好,
但要注意的是,ostream &os前面不能加const,因为在这个函数中,使用os后,os内部的状态可能会被修改,所以不能定义为const
  • 打赏
  • 举报
回复

#include <iostream>
#include <assert.h>
#include <iomanip>
using namespace std;

class myString;

istream& operator>> (istream&,myString&);
ostream& operator <<(ostream&,const myString&);

class myString
{
public:
myString& operator=(const myString&);
int size()const
{
return _size;
}
const char* c_str()const
{
return _string;
}
friend istream& operator>> (istream&,myString&);
private:

int _size;
char* _string;
};

inline myString& myString::operator =(const myString& str)
{
if (this!=&str)
{
if (_string)
delete[]_string;
_size=str._size;//问题一
_string=new char[_size+1];
strcpy(_string,str._string);
}
return *this;
}


inline istream& operator>> (istream& io,myString& s)
{
const int limit_string_size=4096;
char inBuf[limit_string_size];
io>> setw(limit_string_size)>> inBuf;
s._size = strlen( inBuf );
s._string=new char[s._size+1];
strcpy(s._string,inBuf);
return io;
}

inline ostream& operator <<(ostream& os,const myString& s)//问题二
{
return os <<s.c_str();
}

int main()
{
myString s;
cin>>s;
cout<<s;
return 0;
}

Vitin 2008-03-12
  • 打赏
  • 举报
回复
这两个问题其实是一个。因为参数的类型为const myString&,只能调用const函数。
解决它的方法是这样定义size()和c_str()函数:
int size() const {return _size;}
char* c_str() const {return _string;}

65,176

社区成员

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

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