Глупый вопрос по operator+
От: INsideR Латвия  
Дата: 18.10.03 12:54
Оценка:
Есть класс:
class A{
public:
    int k;

    A(int v)
    {
        k = v;
    }
    A(B &b)
    {
                printf("Yes %d", &b);
    }
    void pr()
    {
        printf("Yes");
    }
    virtual ~A()
    {
        printf("\nDestr A %d", k);
    }

    A &operator=(const A &a) 
    {
        k = a.k;
        return *this;
    }

    A &operator+(const A &a) const
    {   
        A s(k + a.k);
        s.pr();
        return s;
    }
};


Правилен ли оператор +, помойму нет, ведь s уничтожается до возвращения? И если не правильно, то как сделать правильно? через static?
Мудр тот, кто знает не многое, а нужное
Re: Глупый вопрос по operator+
От: ilnar Россия  
Дата: 18.10.03 13:05
Оценка:
Здравствуйте, INsideR, Вы писали:


INR>Правилен ли оператор +, помойму нет, ведь s уничтожается до возвращения? И если не правильно, то как сделать правильно? через static?


правильно, объяснять почему воздержусь, может что-то не то ляпну
Re[2]: Глупый вопрос по operator+
От: INsideR Латвия  
Дата: 18.10.03 13:09
Оценка:
Здравствуйте, ilnar, Вы писали:

I>Здравствуйте, INsideR, Вы писали:



INR>>Правилен ли оператор +, помойму нет, ведь s уничтожается до возвращения? И если не правильно, то как сделать правильно? через static?


I>правильно, объяснять почему воздержусь, может что-то не то ляпну


Вроде не правильный, надо наверное так A operator+(const A &a) const
Мудр тот, кто знает не многое, а нужное
Re: Глупый вопрос по operator+
От: Павел Кузнецов  
Дата: 18.10.03 13:12
Оценка:
Здравствуйте, INsideR, Вы писали:

I>
I> class A{
I> public:

I>  . . .

I>  A &operator+(const A &a) const
I>  {
I>   A s(k + a.k);
I>   s.pr();
I>   return s;
I>  }
I> };
I>


I> Правилен ли оператор +, помойму нет, ведь s уничтожается до возвращения?


Верно.

I> И если не правильно, то как сделать правильно? через static?


Нет, не через static. Через возврат по значению:

    A operator+(const A &a) const
    {
        A s(k + a.k);
        s.pr();
        return s;
    }
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Глупый вопрос по operator+
От: ilnar Россия  
Дата: 18.10.03 13:16
Оценка:
Здравствуйте, INsideR, Вы писали:

INR>Здравствуйте, ilnar, Вы писали:


I>>Здравствуйте, INsideR, Вы писали:



INR>>>Правилен ли оператор +, помойму нет, ведь s уничтожается до возвращения? И если не правильно, то как сделать правильно? через static?


I>>правильно, объяснять почему воздержусь, может что-то не то ляпну


INR>Вроде не правильный, надо наверное так A operator+(const A &a) const


я написал так птому, что у меня в таком виде нормально все шло, поэтому от объяснений воздержался,
точно не знаю, что скажет Павел Кузнецов?
Re[2]: Глупый вопрос по operator+
От: INsideR Латвия  
Дата: 18.10.03 13:23
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>
ПК>    A operator+(const A &a) const
ПК>


В книге просто опечатка

Удалено избыточное цитирование. -- ПК.
Мудр тот, кто знает не многое, а нужное
Re[3]: Глупый вопрос по operator+
От: Bell Россия  
Дата: 18.10.03 13:46
Оценка:
Здравствуйте, INsideR, Вы писали:

INR>Здравствуйте, Павел Кузнецов, Вы писали:


ПК>>
ПК>>    A operator+(const A &a) const
ПК>>


INR>В книге просто опечатка


А если следовать принципу "семантика перегруженных операторов должна соответсвовать семантике встроенных", то еще лучше так:
const A operator+(const A &a) const

Любите книгу — источник знаний (с) М.Горький
Re[2]: Глупый вопрос по operator+
От: INsideR Латвия  
Дата: 18.10.03 13:48
Оценка:
ПК>
ПК>    A operator+(const A &a) const
ПК>    {
ПК>        A s(k + a.k);
ПК>        s.pr();
ПК>        return s;
ПК>    }
ПК>


А как происходит всё это? Создаётся объект после return s, на который берётся ссылка, и объект уничтожется после завершения оператора = ?
Мудр тот, кто знает не многое, а нужное
Re: Глупый вопрос по operator+
От: MaximE Великобритания  
Дата: 18.10.03 13:54
Оценка:
INsideR wrote:

I> Есть класс:

I>

I>  A operator+(const A &a) const
I>  {   
I>   A s(k + a.k);
I>   s.pr();
I>   return s;
I>  }
I>


I> Правилен ли оператор +, помойму нет, ведь s уничтожается до возвращения? И если не правильно, то как сделать правильно? через static?


Возвращай результат по значению, а не по ссылке.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re: Глупый вопрос по operator+
От: adontz Грузия http://adontz.wordpress.com/
Дата: 18.10.03 14:17
Оценка:
Здравствуйте, INsideR, Вы писали:
    A operator+(const A & a)
    {   
        A s(k + a.k);
        s.pr();
        return s;
    }
};


Если дополнительное копирование объекта напрягает (меня например напрягает) почитай статьи Александреску про MOJO.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Глупый вопрос по operator+
От: Павел Кузнецов  
Дата: 18.10.03 14:17
Оценка:
Здравствуйте, INsideR, Вы писали:


ПК>>
ПК>>    A operator+(const A &a) const
ПК>>    {
ПК>>        A s(k + a.k);
ПК>>        s.pr();
ПК>>        return s;
ПК>>    }
ПК>>


I> А как происходит всё это? Создаётся объект после return s, на который

I> берётся ссылка, и объект уничтожется после завершения оператора = ?

В точке вызова выделяется память под возвращаемое значение. Внутри функции, в точке return s,
в ранее выделенной памяти создается объект (путем вызова конструктора копирования). Объект s
разрушается при выходе из функции. После завершения полного выражения, в котором содержался вызов
operator+, результат вызова разрушается. Внутри полного выражения результат может быть скопирован,
или к нему может быть привязана константная ссылка, продляя время его жизни. Также компилятору разрешено
в целях оптимизации опускать копирование объекта s в возвращаемое значение, конструируя s
прямо в выделенной под возвращаемое значение памяти.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Глупый вопрос по operator+
От: Доброжелатель Россия  
Дата: 18.10.03 15:21
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, INsideR, Вы писали:


INR>>Здравствуйте, Павел Кузнецов, Вы писали:


ПК>>>
ПК>>>    A operator+(const A &a) const
ПК>>>


INR>>В книге просто опечатка


B>А если следовать принципу "семантика перегруженных операторов должна соответсвовать семантике встроенных", то еще лучше так:

B>
B>const A operator+(const A &a) const
B>

B>

Это почему это
const A operator+(const A &a) const
?????
Я, например хочу написать
a = b+c;

а не могу без const_cast, так как a — не константа???
Бред... Ты сам понимаешь, какой бред получается ??? Зачем тогда нужно это сложение?
Если я что-то не так понял — жду возражений..!
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[5]: Глупый вопрос по operator+
От: Bell Россия  
Дата: 18.10.03 15:35
Оценка:
Здравствуйте, Доброжелатель, Вы писали:


Д>Это почему это
const A operator+(const A &a) const
?????


Д>Я, например хочу написать

Д>
a = b+c;

Д>а не могу без const_cast, так как a — не константа???
Д>Бред...


Д>Ты сам понимаешь, какой бред получается ??? Зачем тогда нужно это сложение?

Д>Если я что-то не так понял — жду возражений..!

А при чем тут а? Константой является результат operator+, и в приведенном тобой выражении — результат выражения b+c. Это уже потом получившаяся константа присвивается a. А поскольку сигнатура оператора присвивания выглядит так:
A& operator = (const A& rhs);

то никаких приблем при присваивании не возникнет.
Вот так
Любите книгу — источник знаний (с) М.Горький
Re[5]: Глупый вопрос по operator+
От: UnrealAlex Россия  
Дата: 18.10.03 15:36
Оценка:
a = b + c;

а семантика оператора = следующая:
A& operator=(const A& _right);


Вот и получается:
a.operator=(b.operator+(c)); // все ок


Или так (если оператор + — глобальный)
a.operator=(operator+(b, c)); // все ок
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
Re: Глупый вопрос по operator+
От: alexanderfedin США http://alexander-fedin.pixels.com/
Дата: 20.10.03 06:56
Оценка:
Написано абсолютно правильно и будет работать.
В зависимости от компилятора C++ (точнее — оптимиздера кода переменная 's' будет либо сконструирована сразу же на области стека, отведенной для возвращаемого значения, либо при возврате будет вызван конструктор копирования.
Чтобы запутать Вас окончательно, задам вопрос: что происходит при возбуждении исключенияи каким образом объект исключения распространяется выше по стеку?
class Exception {...};

class MyException : public Exception {};

void myFunc()
{
throw MyException(...);//генерируем исключение
//здесь сгенерированный объект исключения уничтожается, но перед смертью он копируется в вызывающий стековый фрейм с помощью конструктора копирования
}

void main()
{
try
{
myFunc();
//здесь мы имеем уже не оригинальный объект исключения, а его копию
}
catch (MyException &e)
{
printf("MyException\n");
}
}
Кстати, если попытаться поймать не 'Exception &e' (ссылка), а 'Exception e' (значение), то информация о типе исключения (MyException) будет безвозвратно потеряна и при вызове 'throw;' далее по стеку будет распространяться только 'Exception'. По крайней мере, это происходит в известных мне компиляторах.

Respectfully,
Alexander Fedin (alexanderfedin@iname.com)
"INsideR" <forum@rsdn.ru> wrote in message news:414389@news.rsdn.ru...
From: INsideR

Есть класс:
class A{
public:
int k;

A(int v)
{
k = v;
}
A(B &b)
{
printf("Yes %d", &b);
}
void pr()
{
printf("Yes");
}
virtual ~A()
{
printf("\nDestr A %d", k);
}

A &operator=(const A &a)
{
k = a.k;
return *this;
}

A &operator+(const A &a) const
{
A s(k + a.k);
s.pr();
return s;
}
};


Правилен ли оператор +, помойму нет, ведь s уничтожается до возвращения? И если не правильно, то как сделать правильно? через static?

Глупый вопрос по operator+ Оценить
Posted via RSDN NNTP Server 1.7 "Bedlam"
Respectfully,
Alexander Fedin.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.