C++의 friend 함수 및 연산자 오버로딩을 사용하여 Hi
및 There
두 개의 문자열을 추가하는 다음 코드가 있습니다.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.
포인터의 0 포함 또는 소유권 외에도 읽기 전용 데이터 (문자열 리터럴)를 코드에 쓰는 중입니다. – WhozCraig
의심 할 여지없이 얻을 수있는 컴파일러 경고에주의를 기울여야합니다. 당신의'operator +'는 여러 가지 이유로 정의되지 않은 행동을 일으킨다. – Praetorian
컴파일러에서 -Wall 또는 이와 동등한 옵션을 사용하여 컴파일하지 않으면 구문 오류가 없으므로 operator + 함수에 잘못된 내용이보고되지 않을 수 있습니다. 그것에 대한 모든 경고가 있더라도 컴파일러는 포인터가 함수에 전달 되었기 때문에 포인터가 읽기 전용임을 인식하지 못할 수 있습니다. – IllusiveBrian