Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > operator int() и operator=(int)


Автор: MAKCim 31.5.2006, 22:31
возник такой вопрос
Код

class A
{
private:
     int a;
public:
    operator int&() {return a;}
};

int main()
{
    A a;
    a=6;       // Требует operator=. Почему не происходит конвертация в int&? Или в случае присвоения обязательно
    return 0;   // должен быть перегружен operator=?
}
  

Автор: Xenon 31.5.2006, 22:33
MAKCim
Вроде как обязательно необходима перегрузка и без вариантов. 

Автор: DeadSoul 31.5.2006, 23:05
Цитата(XenonSk @  31.5.2006,  22:33 Найти цитируемый пост)
Вроде как обязательно необходима перегрузка и без вариантов.  

Пункт стандарта? 

Автор: bel_nikita 31.5.2006, 23:10
Цитата(DeadSoul @ 31.5.2006,  22:05)
Пункт стандарта?

Думаю нужно начинать - какой компилятор? smile  

Автор: Xenon 31.5.2006, 23:12
Эм ... это изрекла наша училка по инфе smile Видать очередное "изречение" после тогда, как вместо NULL, она написала NOLL.

Ну хотя теоретически ... При встрече оператора "=" компилятор ищет перегрузку для него сначала? 

Автор: BreakPointMAN 31.5.2006, 23:15
Чтобы выполнить строку

Код

a=6;


в классе A должен быть либо определен конструктор с параметром типа int, либо оператор присваивания с параметром типа int. 

Код

operator int&()

это вообще немного из другой оперы... это оператор преобразования... там, где будет встречаться объект класса A (в нашем примере a), а подразумеваться использование объекта типа int, то реально будет использоваться значение целочисленного члена класса A по имени a
 

Автор: DeadSoul 31.5.2006, 23:27
Цитата(bel_nikita @  31.5.2006,  23:10 Найти цитируемый пост)
Цитата(DeadSoul @ 31.5.2006,  22:05)
Пункт стандарта?
Думаю нужно начинать - какой компилятор?    

Лично я проверял на восьмерке.

А неявные преобразования типа для left hand argument вообще применябтся?
 

Автор: BreakPointMAN 31.5.2006, 23:30
а ссылку там нельзя...  надо так:
Код

operator int() {return a;}
 

Автор: MAKCim 1.6.2006, 09:26
Цитата

а ссылку там нельзя...  надо так:

ну не надо
все отлично работает (GNU gcc 4.0.2) если убрать a=6
Цитата

это вообще немного из другой оперы... это оператор преобразования... там, где будет встречаться объект класса A (в нашем примере a), а подразумеваться использование объекта типа int, то реально будет использоваться значение целочисленного члена класса A по имени a

это понятно
вот я и думаю
в моем случае встречается объект класса A, а подразумевается переменная типа int
не вижу логики в этой ошибке. По идее если есть необходимый operator=
его нужно использовать, в остальных случаях использовть то что есть  smile

Добавлено @ 09:26 
Цитата

Лично я проверял на восьмерке.

И? 

Автор: sergejzr 1.6.2006, 09:37
MSVisual C++6

Всё компилируется и работает.  

Автор: likehood 1.6.2006, 09:52
Цитата(sergej.z @  1.6.2006,  10:37 Найти цитируемый пост)
MSVisual C++6

Всё компилируется и работает.


Если ты про первый пост, то в VC7.1 не компилится. 

Автор: ZeusAtVingrad 1.6.2006, 09:58
Цитата(BreakPointMAN @ 31.5.2006,  23:15)
Чтобы выполнить строку

Код

a=6;


в классе A должен быть либо определен конструктор с параметром типа int, либо оператор присваивания с параметром типа int. 

А конструктор зачем? 

Автор: BreakPointMAN 1.6.2006, 09:58
гм... ну... возможно...  хотя я на практике не встречал такого.

Добавлено @ 10:03 
Цитата(ZeusAtVingrad @  1.6.2006,  09:58 Найти цитируемый пост)
А конструктор зачем?

Если будет определен конструктор с параметром типа int и не будет определено оператора присваивания с параметром типа int, то сначала будет создан безымянный объекта класса A, а затем будет выполнено присваивание. 

Автор: MAKCim 1.6.2006, 10:31
Цитата

Если будет определен конструктор с параметром типа int и не будет определено оператора присваивания с параметром типа int, то сначала будет создан безымянный объекта класса A, а затем будет выполнено присваивание. 

это?
Код

struct A
{
    A(int) {}
};

int main()
{
    A a;
    a=6;
    return 0;
}

если да то, то у меня ошибка компиляции 

Автор: BreakPointMAN 1.6.2006, 10:57
Код

class A
{
private:
     int a;
public:
     A():a(0){} // конструктор по умолчанию
     A(int _a):a(_a){} // конструктор с параметром int
};

int main()
{
    A a;
    a=6;
    return 0;
}
  

Автор: ZeusAtVingrad 1.6.2006, 12:00
Цитата(BreakPointMAN @ 1.6.2006,  09:58)
Добавлено @ 10:03 
Цитата(ZeusAtVingrad @  1.6.2006,  09:58 Найти цитируемый пост)
А конструктор зачем?

Если будет определен конструктор с параметром типа int и не будет определено оператора присваивания с параметром типа int, то сначала будет создан безымянный объекта класса A, а затем будет выполнено присваивание.

Так объект-то уже создан.
И потом, если у него всё-таки не будет оператора присваивания, то как будет "выполнено присваивание"?
Конструктор с параметром - это копирующий конструктор для конструкций (пардон за тавалогию) вроде этой:

Код

А а(10);
 

Автор: BreakPointMAN 1.6.2006, 12:06
Цитата(ZeusAtVingrad @  1.6.2006,  12:00 Найти цитируемый пост)
И потом, если у него всё-таки не будет оператора присваивания, то как будет "выполнено присваивание"?

Будет использован оператор присваивания, созданный компилятором по умолчанию, выполняющий почленное копирование. 

Автор: ZeusAtVingrad 1.6.2006, 13:39
А что, бывает такое? 

Автор: MAKCim 1.6.2006, 14:27
Цитата

А что, бывает такое?  

да, и очень часто
если у тебя в классе нет специфической работы с указателями, ссылками, а есть только экземпляры классов или встроенных типов копирующий конструктор и оператор присваивания можно (и даже нужно) не определять 

Автор: ZeusAtVingrad 1.6.2006, 14:55
Т.е. если у меня в классе объявлен указатель на что-либо, то копилятор возьмёт на себя смелость скопировать в него значение такого же указателя из другого объекта этого класса? 

Автор: likehood 1.6.2006, 15:09
Именно! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)