friend 함수를 사용하여 사전 증가 연산자를 오버로드했습니다. 오버로드 된 friend 함수에서 변수 값이 올바르게 표시됩니다. 하지만 그 값은 디스플레이 기능에 표시되지 않습니다. 왜 그런가요?
#include <iostream>
using namespace std;
class Rectangle {
public:
int breadth;
public:
void read();
void display();
friend void operator ++(Rectangle r1);
};
void Rectangle::read()
{
cout << "Enter the breadth of the Rectangle: ";
cin >> breadth;
}
void operator++(Rectangle r1)
{
++r1.breadth;
cout<<r1.breadth<<endl; //correct result
}
void Rectangle::display()
{
cout<<breadth<<endl; // not showing pre-incremented value, why ???
}
int main()
{
cout<<"Unary Operator using Friend Function \n";
Rectangle r1;
r1.read();
++r1;
cout << "\n breadth of Rectangle after increment: ";
r1.display();
return 0;
}
하신 operator ++
얻어 Rectangle
그것이 수신 수단에 의하여 값 객체 복사본 의 피연산자를. 그런 다음 사본의 breadth
구성원 을 성실하게 증가시키고 인쇄 한 다음 끝날 때 사본을 버립니다.
참조로 매개 변수를 사용하는 것이 좋습니다.
friend void operator ++(Rectangle &r1)
{
++r1.breadth;
}
또한 자유 함수 대신 멤버 함수를 사용하여 단항 연산자를 오버로드하는 것이 매우 일반적입니다. 이렇게 사용하면이 문제가 발생하지 않습니다.
class Rectangle
{
// ...
public:
void operator++ ()
{
++breadth;
}
// ...
};
몇 가지 추가 의견 :
operator++
기본 제공 연산자가 수행하는 작업을 모방하기 위해 피연산자에 대한 참조를 반환하는 것이 일반적입니다 . 에 ++ ++ i
대해 int i
할 수있는 것처럼 ++ ++ r
사용자 정의 유형 r
에 대해서도 가능해야합니다 .
실제로 연산자 오버로딩은 a) 내장 유형과 유사하게 동작하는 유형을 작성하거나 b) 도메인 별 언어를 작성하는 경우에만 사용해야합니다. 사각형을 늘리는 것은 직관적으로 설명 할 수있는 것이 아니며 명명 된 멤버 함수로 수행하는 것이 가장 좋습니다. ++r
너비, 높이 또는 둘 다 증가 하는지 , 직사각형을 오른쪽으로 이동하는지 또는 ...을 어떻게 알 수 있습니까?
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다