다른 기능과 함께 자주 사용되지 않는 연산자를 작성할 때 알아야 할 몇 가지 사항이 있습니다.
class v {
public:
double x_, y_;
v& operator += (const v& rhs)
{
_x += rhs._x;
_y += rhs._y;
return *this;
}
};
또 다른 흥미로운 하나, 사전 ++ 및 사후 ++ 때문 만이 사용되지 않은 다른 위치 :
할당 사업자
, 예를 들어,이 벡터의 값을 변경하기 때문에 *이 돌아갑니다 매개 변수 :
class v {
public:
double x_, y_;
v& operator ++(); // ++v
v& operator ++ (int); // v++
};
"같음"(할당)은 포인터를 사용할 때 까다로운 또 다른 것입니다. 벡터의 경우, 일반적으로 문제가되지 않습니다,하지만 당신은 벡터 V를 정의하고 그 자체에 할당하는 경우, 당신은 조심해야 다음의 경우() 것입니다 확실히 귀하의 경우에는
class v {
public:
double x_, y_;
v& operator = (const v& rhs)
{
if(this != &rhs)
{
x_ = rhs.x_;
y_ = rhs.y_;
}
}
};
, 하지 유용하지만,이 같은 일을 생각 :
delete p_;
p_ = new foo;
p_->x_ = rhs.p_->x_;
& 만약 우 ==이 다음 delete p_
은 RHS는 포인터 삭제! 즉, 3 행에서 액세스하는 것은 버그입니다.
나머지는 쉽게 작업 할 수 있어야합니다. 비교 연산자는 bool을 반환하고 const입니다.
class v {
public:
double x_, y_;
bool operator == (const v& rhs) const
{
return x_ == rhs.x_ && y_ == rhs.y_;
}
};
[] 연산자 제외. 당신이 볼 수 있듯이
class v {
public:
// I would imagine you'd use an array but as a simple example...
double x_, y_;
double operator [] (int idx) const
{
return idx == 0 ? x_ : y_;
}
v_ref operator [] (int idx)
{
v_ref v(this, idx);
return r;
}
};
에서, [] 연산자의 상수가 아닌 버전에 대한 참조를 반환 : 하나의 두 가지 버전이 있습니다.
r[3] = 7.3;
R [3] 참조가 다음 기준의 할당이 매개 변수로 7.3 호출되어 반환 : 당신이 뭔가를 쓸 수 있도록이 필요합니다.
class v_ref
{
public:
v *p_;
int i_;
v_ref(v *p, int i)
: p_(p), i_(i)
{
}
operator = (double q)
{
// again, I suppose you'd use an array instead!
if(i_ == 0)
{
p_->x_ = q;
}
else
{
p_->y_ = q;
}
}
};
... 당신이 주요 벡터 객체가 모든 참조 개체 전에 삭제됩니다 경우 알 수 있도록 몇 가지 보안, 벡터 포인터가 참조 카운터의 사용을 만들 수 원하는 또 다른 메모를 가정 : 나는 것 생성자가 double의 배열을 할당한다고 상상해보십시오 (또는 std :: vector type ...을 사용하십시오). new를 사용하는 경우 소멸자에서 삭제할 것을 잊지 마십시오. 대입 연산자의 if()가 매우 중요한 경우입니다.
"수학적 벡터"라고 할 때 실제 유형은 무엇입니까? –
이렇게하면 되나요? http://www.cplusplus.com/doc/tutorial/classes2/ – JustinDanielson
uni에서의 향후 연구에서 우리는 "수학적 벡터가 아닌 STL vector"를 사용할 것이라는 말을 들었습니다. 그래서 그들은 똑같은지 다른지 확실하지 않습니다. – SharpCode