一个程序,那位大哥帮忙分析下问题和程序具体是怎么走的呢?

summerYe 2010-01-16 10:47:49
#include <iostream>
#include <cstring>
using namespace std;
class Stringbad //设计一个不好的string类
{
private:
char *str; //1.error:see declaration of 'str'.为什么?
int len;
static int numStrings;
public:
Stringbad();
Stringbad(const char *s);
~Stringbad();
friend ostream & operator << (ostream & os,const Stringbad & st);//2.运算符重载似乎有问题?VC6.0的漏洞?
};
int Stringbad::numStrings = 0;
Stringbad::Stringbad()
{
len = 4;
str = new char[4];
strcpy(str,"c++");
numStrings++;
cout << numStrings << ": \"" << str << "\"default object created" << endl;
}
Stringbad::Stringbad(const char *s)
{
len = strlen(s);
str = new char[len + 1];
strcpy(str,s);
cout << numStrings << ": \"" << str << "\"object created" << endl;
}
Stringbad::~Stringbad()
{
cout << "\"" << str << "\"object deleted, ";
--numStrings;
cout << numStrings << " left" << endl;
delete[]str;
}
ostream& operator << (ostream & os, const Stringbad & st)
{
os << st.str;//3.书上是这样写的,为什么这里不行?友元不能访问对象吗?
return os;
}
void callme1(Stringbad & rsb)
{
cout << "String passed by reference: \n";
cout << " \"" << rsb << "\"\n";
}
void callme2(Stringbad sb)
{
cout << "String passed by value: \n";
cout << " \"" << sb << "\"\n";//error: << is ambiguous
}
int main()
{
Stringbad headline1("Celery Stalks at Midnight");//这三行调用时构造函数要输出三行。
Stringbad headline2("Lettuce Prey");//4.程序是先析构这个对象还是下面的knot?
Stringbad sports("Spinach Leaves Bowl for Dollars");

cout << "headline1: " << headline1 << endl;//再输出三行
cout << "headline2: " << headline2 << endl;
cout << "sports: " << sports << endl;

callme1(headline1);
cout << "headline1: " << headline1 << endl;
callme1(headline2);//5.传值调用会导致析构函数被调用吗?这里输出“lettuce prey "deleted.2 lefted
cout << "headline2: " << headline2 << endl;

cout << "Initialize one object to another: " << endl;
Stringbad sailor = sports; //等价于Stringbad sailor = Stringbad(sports)不知道是调用什么构造函数。
cout << "sailor: " << sailor << endl;
cout << "Assign one object to another: " << endl;
Stringbad knot; //6.第五个对象,这里会调用默认构造函数还是显示构造函数?默认的?numStrings会加一吗?
knot = headline1; //7.这算第五个对象还是第六个?如果算第五个又调用显式构造函数的话numStrings会再加一吗
cout << "knot: " << knot << endl;
cout << "End of main()\n";//析构函数似乎不对劲,程序故意设计的
return 0;
}



...全文
103 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggqlt 2010-01-16
  • 打赏
  • 举报
回复
callme2(headline2);//传值操作
Stringbad sailor = sports;
上面两句都是调用拷贝构造函数Stringbad(const Stringbad &s);,你这里没有.
ggqlt 2010-01-16
  • 打赏
  • 举报
回复
傻了,传值操作是
1.申请对象空间(新的对象,还未初始化)
2.简单赋值,就是把原来的内容复制一份(初始化)
//新对象和原对象的str相同,指向相同内存空间

函数运行完了后,要把新对象析构掉,收回空间,就要先运行析构函数,删除str指向的内存,所以把字符串给改了,headline2打印出来也就变成乱码了。

好久不碰,都快忘光了

[Quote=引用 7 楼 ggqlt 的回复:]
callme2(headline2);//5.传值调用会导致析构函数被调用吗?这里输出“lettuce prey "deleted.2 lefted
cout < < "headline2: " < < headline2 < < endl;

见鬼了,为什么用vs2005运行这句后,输出的headline2是乱码啊?
[/Quote]
ggqlt 2010-01-16
  • 打赏
  • 举报
回复
callme2(headline2);//5.传值调用会导致析构函数被调用吗?这里输出“lettuce prey "deleted.2 lefted
cout << "headline2: " << headline2 << endl;

见鬼了,为什么用vs2005运行这句后,输出的headline2是乱码啊?
summerYe 2010-01-16
  • 打赏
  • 举报
回复
谢谢,运算符重载这章我基本知识还是会的,我也自己重载过“+,《”可这下不灵了。主要是这个编译器不大好使,这个在VS上估计没错。构造函数和析构函数也懂,只是这里涉及到拷贝构造函数来了,新内容,如果你们能讲的话我相信我还是能看懂。[Quote=引用 5 楼 hqin6 的回复:]
引用 1 楼 summerye 的回复:
上面注释有几个小问题,还有对象的构造函数和析构函数是能帮忙说下具体是怎么运行的呢?这个程序在VC6.0是不能运行的,大概是运算符重载的问题,我改得累死都没改成功。上次一个叫logi的大哥帮我搞了下,不过我仍然是知其然而不知其所以然。
先学基础多看书吧~~要不然别人给你讲了你也不懂!!
[/Quote]
太乙 2010-01-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 summerye 的回复:]
上面注释有几个小问题,还有对象的构造函数和析构函数是能帮忙说下具体是怎么运行的呢?这个程序在VC6.0是不能运行的,大概是运算符重载的问题,我改得累死都没改成功。上次一个叫logi的大哥帮我搞了下,不过我仍然是知其然而不知其所以然。
[/Quote]先学基础多看书吧~~要不然别人给你讲了你也不懂!!
summerYe 2010-01-16
  • 打赏
  • 举报
回复
仍然感谢你的热心。[Quote=引用 2 楼 z569362161 的回复:]
不明白
[/Quote]
summerYe 2010-01-16
  • 打赏
  • 举报
回复
他 帮我运行成功了,他是在程序最前面声明一个class Stringbad和ostream & operator << (ostream & os, const Stringbad & st);
z569362161 2010-01-16
  • 打赏
  • 举报
回复
不明白
summerYe 2010-01-16
  • 打赏
  • 举报
回复
上面注释有几个小问题,还有对象的构造函数和析构函数是能帮忙说下具体是怎么运行的呢?这个程序在VC6.0是不能运行的,大概是运算符重载的问题,我改得累死都没改成功。上次一个叫logi的大哥帮我搞了下,不过我仍然是知其然而不知其所以然。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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