Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class A
{
int x;
public:
A(int _x): x(_x) {}
operator int() const {
return x;
}
};
void foo() {
A a;
int b;
b = a;
}
Запрещена перегрузка оператора возведения в степень (как в Fortran) "**".
Но на самом деле, в этом случае произойдет вызов конструктора в первой строке, далее вызов конструктора копирования, который скопирует объект, а далее, при раскрутке стека вызовется деструктор
Если оператор должен возвращать новое значение, то необходимо создавать новый объект (как в случае бинарного плюса). Если вы хотите запретить изменение объекта как l-value, то нужно возвращать его константным.
const Integer Integer::operator-(const Integer& i) ;
то становится возможным существование следующего кода:
3.10 Lvalues and rvalues
5 The result of calling a function that does not return a reference is an rvalue. User defined operators are
functions, and whether such operators expect or yield lvalues is determined by their parameter and return
types.
class Integer
{
private:
int value;
public:
Integer(int i): value(i)
{}
friend const Integer operator+(const Integer& left, const Integer& right);
friend Integer& operator+=(Integer& left, const Integer& right);
Integer operator-(const Integer& i) { value= -value; return *this; }
friend bool operator==(const Integer& left, const Integer& right);
};
const Integer operator+(const Integer& left, const Integer& right) {
return Integer(left.value + right.value);
}
Integer& operator+=(Integer& left, const Integer& right) {
left.value += right.value;
return left;
}
bool operator==(const Integer& left, const Integer& right) {
return left.value == right.value;
}
int main ()
{
Integer i = 0, j = 1;
i - j = 0;
i - 1 = 0;
}
class Int
{
public:
Int &operator++( int n );
private:
int _i;
};
Int& Int::operator++( int n )
{
if( n != 0 ) // Handle case where an argument is passed.
_i += n;
else
_i++; // Handle case where no argument is passed.
return *this;
}
int main()
{
Int i;
i.operator++( 25 ); // Increment by 25.
}
Point &operator= (const long double X)
{ x = X; return *this; }
void operator, (const long double Y)
{ y = Y; }
Point pt;
// ...
pt = 7, 8;
Перегрузка операторов в C++