一个关于赋值操作符的问题
有一程序:
#include<iostream.h>
#include<string.h>
class string
{
private:
char * str;
public:
string(char * s=" ")
{
cout<<"在构造函数中\n";
int size=strlen(s);
str=new char[size+1];
strcpy(str,s);
}
~string()
{
delete str;
}
string& operator=(string& ss)
{
cout<<"赋值操作符\n";
delete str;
str=new char[strlen(ss.str)+1];
strcpy(str,ss.str);
return *this;
}
void showstring()
{
cout<<str<<endl;
}
};
void main()
{
string s1="内存中的字符串";
cout<<"s1=";
s1.showstring();
string s2;
s2=s1;
cout<<"s2=";
s2.showstring();
}
我有几点不明白,在成员函数:
string& operator=(string& ss)
{
cout<<"赋值操作符\n";
delete str;
str=new char[strlen(ss.str)+1];
strcpy(str,ss.str);
return *this;
}
中,为什么要delete str;他删除的又是谁的str?
另外,这其实是个赋值操作符=的重载,那么里面strcpy(str,ss.str);中的str一定是指s2的吗?
问题点数:20、回复次数:10Top
1 楼cngdzhang()回复于 2004-05-04 21:00:08 得分 6
cout<<"赋值操作符\n";
delete str;
str=new char[strlen(ss.str)+1];
strcpy(str,ss.str);
return *this;
是它自己的str,在构造函数中分配的空间
delete str;
是因为它要从新分配空间
在从新分配空间之前,要把原先分配的释放掉
Top
2 楼cngdzhang()回复于 2004-05-04 21:02:43 得分 0
类中的非静态变量,
在类的每一个实例中都有自己的一份的
静态变量在整个类中只有一份
Top
3 楼cngdzhang()回复于 2004-05-04 21:04:50 得分 0
s2=s1;
在这里面str是s2的
如果是
s1=s2;
则是s1的
Top
4 楼Leung_(Vector)回复于 2004-05-04 22:53:20 得分 7
delete str;
of course "str" is s2's str.
we should use this because s2 may allocate some memory, for example:
string s1 = "abc";
string s2 = "efg"; // here s2 allocate 3 bytes memory.
then if:
s2 = s1;
before we copy s1.str to s2.str, we should first deallocate the 3 bytes otherwise there will be a memory leak.
You can find many many such topics in "Effective C++".
Top
5 楼carambo(单叶草--(***实干才有好运***))回复于 2004-05-04 23:18:42 得分 0
进来学习.:)Top
6 楼wuboy2000(摇滚麦克)回复于 2004-05-06 14:48:55 得分 0
string s2;
我在类中并没有编写不带参数的默认构造函数啊?为什么还会给s2初始化呢?
string(char * s=" ")
{
cout<<"在构造函数中\n";
int size=strlen(s);
str=new char[size+1];
strcpy(str,s);
}
这个不是带参数的构造函数吗?难道它能用来初始化s2?Top
7 楼freefalcon(心宇—消失中...)回复于 2004-05-06 14:56:02 得分 7
string(char * s=" ")
但你使用了缺省参数
默认构造函数的定义是: 不带参数,或者所有参数都使用了缺省参数Top
8 楼wuboy2000(摇滚麦克)回复于 2004-05-06 15:07:26 得分 0
参数使用了缺省参数,在这里可不可以理解为向使用了默认值一样?Top
9 楼freefalcon(心宇—消失中...)回复于 2004-05-06 15:09:48 得分 0
是的,缺省值的意思就是在未显示指定值的情况下而采用的默认值Top
10 楼wuboy2000(摇滚麦克)回复于 2004-05-06 15:14:37 得分 0
thanks!Top




