我有以下代碼添加兩個字符串Hi
和There
使用C++中的朋友函數和運算符重載。在C++中的朋友函數和運算符重載
#include<iostream.h>
#include<conio.h>
class STRING
{
char *str;
public:
STRING(char *p) { str=p; }
STRING(STRING& s) { str=s.str; }
friend STRING operator+(STRING &s1,STRING& s2);
friend ostream& operator<<(ostream& dout,STRING& s)
{
dout<<s.str;
return dout;
}
};
STRING operator+(STRING &s1,STRING& s2)
{
STRING x(s1); int i,j=0;
for(i=0;x.str[i]!='\0';i++);
x.str[i]=' ';
while((x.str[++i]=s2.str[j++])!='\0');
x.str[i]='\0';
return x;
}
void main()
{
clrscr();
cout<<"\n\n\t\t";
STRING s1="Hi"; cout<<" String s1: "<<s1<<"\n\n\t\t";
STRING s2="There"; cout<<" String s2: "<<s2<<"\n\n\t\t";
STRING s3=s1+s2; cout<<" S1+S2 is : "<<s3<<"\n\n\t\t";
getch();
}
當我建立的解決方案其不顯示任何錯誤,但如果我運行這個程序,我收到以下錯誤在彈出框中
Unhandled exception at 0x011f1506 in Program 6.exe: 0xC0000005: Access violation writing location 0x011f7860.
除了指針的零遏制或所有權之外,您還將只讀數據(字符串文字)發送到向其寫入*的代碼中。 – WhozCraig
也許你應該首先關注你毫無疑問得到的編譯器警告。您的'operator +'會導致未定義的行爲,原因有幾個。 – Praetorian
如果他在編譯器中沒有用-Wall或某個等價選項進行編譯,則可能不會在operator +函數中報告任何錯誤,因爲沒有語法錯誤。即使所有的警告都可能是由於編譯器傳遞給函數,編譯器不能識別指針是隻讀的。 – IllusiveBrian