关于C++中运算符重载的问题
#include<iostream.h>
#include<string.h>
enum bool {true,false};
bool flag;
class strings {
int length;
char *contents;
public:
strings(char *s)
{
length=strlen(s);
contents=new char[length+1];
strcpy(contents,s);
}
strings()
{
length=0;
contents=NULL;
}
~strings() { delete contents;}
int getlength() {return length;}
strings operator + (strings str1);
bool operator < (strings str1);
void print() { cout<<contents<<" "<<length<<"\n";}
};
strings strings::operator + (strings str1)
{
strings str2;
str2.length=length+str1.length;
str2.contents=new char[str2.length+1];
strcat(str2.contents,contents);
strcat(str2.contents,str1.contents);
return str2;
}
bool strings::operator < (strings str1)
{
if (length>str1.length)
{
if (strcmp(contents,str1.contents)<=0) { flag=true;}
else flag=false;
}
else flag=false;
return flag;
}
main()
{
strings obj1("The "),obj2("Object"),obj3,obj4("Hello World");
cout<<"obj1 is "; obj1.print();
cout<<"obj2 is "; obj2.print();
obj3=obj1+obj2;
cout<<"obj1+obj2=obj3="; obj3.print();
cout<<"obj4 is "; obj4.print();
if (obj2<obj3==true) cout<<"obj2 is obj3 substring"<<"\n";
if (obj4<obj3==true) cout<<"obj4 is obj3 substring"<<"\n";
else cout<<"obj4 is not obj3 substring"<<"\n";
return 1;
}
哪位大虾赐教错在哪里!
问题点数:20、回复次数:9Top
1 楼holyfire(谁最衰啊你最衰,谁最帅啊我最帅)回复于 2001-05-22 15:25:00 得分 0
重载operator +时
str2是在栈中建立的临时变量,函数结束时就释放掉了,要作为左值赋obj3
需要再写一个拷贝构造函数
strings( strings const& str1 );
和重载运算符=
string& operator = ( strings const& str1 );Top
2 楼holyfire(谁最衰啊你最衰,谁最帅啊我最帅)回复于 2001-05-22 15:28:00 得分 15
#include<iostream.h>
#include<string.h>
enum bool {true,false};
bool flag;
class strings {
int length;
char *contents;
public:
strings(char *s)
{
length=strlen(s);
contents=new char[length+1];
strcpy(contents,s);
}
strings():length(0),contents(NULL){}
strings( strings const& str1)
{
length=str1.length;
contents=new char[length+1];
strcpy(contents,str1.contents);
}
~strings()
{
if( contents )
delete contents;
}
int getlength() {return length;}
strings operator + (strings str1);
bool operator < (strings str1);
strings& operator = (strings const& str1 )
{
length=str1.length;
contents=new char[length+1];
strcpy(contents,str1.contents);
return *this;
}
void print(){ cout<<contents<<" "<<length<<"\n";}
};
strings strings::operator + (strings str1)
{
strings str2 ;
str2.length=length+str1.length;
str2.contents=new char[str2.length+1];
strcpy(str2.contents,contents);
strcat(str2.contents,str1.contents);
return str2;
}
bool strings::operator < (strings str1)
{
if (length>str1.length)
{
if (strcmp(contents,str1.contents)<=0)
flag=true;
else
flag=false;
}
else
flag=false;
return flag;
}
main()
{
strings obj1("The "),obj2("Object"),obj3,obj4("Hello World");
cout<<"obj1 is ";
obj1.print();
cout<<"obj2 is ";
obj2.print();
obj3=obj1+obj2;
cout<<"obj1+obj2=obj3=";
obj3.print();
cout<<"obj4 is ";
obj4.print();
if (obj2<obj3==true)
cout<<"obj2 is obj3 substring"<<"\n";
if (obj4<obj3==true)
cout<<"obj4 is obj3 substring"<<"\n";
else cout<<"obj4 is not obj3 substring"<<"\n";
return 1;
}
Top
3 楼TCXHL(随风逝去)回复于 2001-05-23 11:07:00 得分 0
可是<的判断结果似乎仍然不正确Top
4 楼TCXHL(随风逝去)回复于 2001-05-23 11:13:00 得分 0
可是<的判断结果似乎仍然不正确Top
5 楼TCXHL(随风逝去)回复于 2001-05-23 11:14:00 得分 0
可是<的判断结果似乎仍然不正确Top
6 楼holyfire(谁最衰啊你最衰,谁最帅啊我最帅)回复于 2001-05-23 11:20:00 得分 5
这时你自己的代码编错了
bool strings::operator < (strings str1)
{
if (length<=str1.length)//这里不应该为>
{
if (strcmp(contents,str1.contents)<=0)
flag=true;
else
flag=flase;
}
else
flag=false;
return flag;
}
Top
7 楼qingsong99(青松)回复于 2001-05-23 14:40:00 得分 0
正如holyfire(发了才的众神之焰)
所改,string operate+(string str1)应该为string &operate+(string str1)
如不想改,可以添加一个拷贝构造函数。Top
8 楼glhorse(happy day)回复于 2001-05-23 14:56:00 得分 0
,.,Top
9 楼stonechina()回复于 2001-05-25 16:39:00 得分 0
在operator=执行过程中,编译器(VC6)好象都用到了一个中间变量:
obj3 =_meddle_variant;
_meddle_variant.~strings();//释放
为何多了拷贝构造函数后中间变量会:
在opetator+函数RETURN时会自动调用拷贝构造函数拷贝str2,生成了一个中间变量。
而没有拷贝构造函数时:
operator+函数的RETURN只是将str2.length&str2.contents送到一个好象是中间变量的内存区域,最后在释放中间变量时。因试图delete str2.contents时出错。
这拷贝构造函数和其他的构造函数,编译器是如何决定何时和地调用?
象本例中编译器“悄悄”调用,编码时又如何觉察?
假如类中没有指针成员变量,是否可以不声明拷贝构造函数?
Top




