Wypros za C++

10 отговора 434 прегледа
#1

Wypros za C++

Zdrawejte.

Towa e primer ot edin u4ebnik po programirane na C++ w kojto se pokazwa kak se preobrazuwa bazow tip w tip class.

# include "iostream.h"
# include "stdio.h"
# include "string.h"
class bank {
int nbr ;
double total ;
public :
bank ( int i = 0 , double j = 0 ) {
nbr = i ;
total = j ;
cout<<"Konstruktor zа obekt na adres : "<<this<<endl ;
}
bank ( bank &x ) {
nbr = x.nbr ;
total = x.total ;
cout<<"Konstruktor za kopirane na "<<&x<<" na "<<this<<endl ;
}
bank &operator+(bank &x) {
nbr += x.nbr;
total += x.total ;
return *this ;
}
void out () {
cout<<"broj wlogowe = "<<nbr<<" , Suma = "<<total<<endl ;
}
friend void fun ( bank y ) ;
};

void fun ( bank y ) {
cout << "broj wlogowe = " << y.nbr << endl ;
}

void main () {
bank b( 5, 100000 ) , c ;
b.out () ;
b=bank(6) ;
b.out () ;
b = 6 ;
b.out () ;
fun ( 8) ;
c = b + 6 ; // na tozi red mi pokazwa gre6ka
c.out () ;
getchar () ;
}



Wyprosa mi e kak taka stawa, 4e tozi primer trygwa bez problem na edin star Borland C++ 3.1,
a na Microsoft Visual C++ 6.0 mi pokazwa gre6ka

error C2679: binary '+' : no operator defined which takes a right-hand operand of type 'const int' (or there is no acceptable conversion)

Blagodarq na wsi4ki otzowali se.

Редактирано от Larkin на

Отговор
в отговор на Larkin #2

Re: Wypros za C++

Липсва подходящ конструктор.

Отговор
в отговор на Larkin #3

Re: Wypros za C++

Prichinata ste da e v
bank ( int i = 0 , double j = 0 ), constructora. Iavno na borland compilatora se sehta da konstruira obekt nai veroiatno taka bank(5, 0), koeto e po nepravilno spored men, po dobre e da dava greshka.

Po pricnicip e tupo da slagash na konstruktora default parametri i to poveche ot edin, definiriai si razlichni konstruktori ako ti triabva. Osven tova taka kakto e napisan operatora +, niama da raboti v sluchia c = 6 + b, triabva da e static bank operator+(const bank& ..., const bank& ...). I po prinsip operatora plus ne triabva da vrusta reference, taka raboti za internal tipovete i e tupo semantikata za custom tipovete da e druga. Hvurli go niakude tozi uchebnik i si nameri drug.

Отговор
в отговор на Larkin #4

Re: Wypros za C++

Временният обект, който се конструира е константен и ако напишеш
( const bank &x ) в декларацията на оператора няма да имаш проблеми.
Съветвам те да не ползваш operator+ вместо operator+= , защото стават грешки така. А operator+ по смисъл е константна функция и е добре да го дефинираш така.

Отговор
в отговор на Larkin #5

Re: Wypros za C++

spored MS VC++ ne moje da se izpolzwa constructor s poweche
ot edin argument za implicit construction
kakywto e sluchaia...
ne znam spored ANSI C++ kak e :)

Отговор
в отговор на emo #6

Re: Wypros za C++

Може. Виж, че по-горе в кода има такава употреба.

Отговор
в отговор на emo #7

Ууупс!

Това било присвояване. Значи не е задължително конструираният временен обект да е const . Излъгал съм ви и двамата:). Не знам причината, но с const върви.

Отговор
в отговор на pm #8

Re: Wypros za C++

а защо да е тъпо да си правиш конструктори с дефолт параметри?

мене ме мързи да правя много конструктори и редовно слагам дефолт... има някаква опасност ли?

техното е за неуспелите в поп-фолка
...стара китайска поговорка
Отговор
в отговор на grouchy #9

Re: Wypros za C++

E, tupo e malko presileno, zavisi koga i kak gi izpolzvash. Nai malkoto vij che sega picha se chudi zasto ne se kompilira, znachi ne e dobre.

No primerno triabva da se vnimava za default params na virtual funkcii zastoto se baindvad statcichno i ako predefienirash methoda i smenish default valueto ste ti raboti greshno v povecheto sluchai. Abe kato cialo po dobre bez default params, osven ako ne e naistina nalojitelno, tva e lichno mnenie de.

Отговор
в отговор на Larkin #10

Re: Wypros za C++

Parametyra na operator+ trqbva da e const&.
Otnosno konstruktorite - v c++ standarta ima edno ponqtie "conversion by constructor"( 12.13.1 [class.conv.ctor] ). Tova e vseki konstruktor, koito moje da byde izvikan s edin parametyr i ne e deklariran kato explicit. v sluchaq bank( int, double ) e tochno takyv i toi se izpolzva.
Prichinata da ne se kompilira bez const& e v C++ standard 8.5.3 [dcl.init.ref ]. Nai-sbito kazano - za da se prisvoi rvalue na reference, to "the reference shall be to a non-volatile const type".

Отговор
в отговор на lvo #11

Браво, пич!

Не ми се вярваше някой да си направи труда да даде смислен отговор. Тук обикновено е "Програмисти говорят за програмисти" - имаше навремето такъв импулсен телефон("Жени говорят за жени"). Никой не ебава самото програмиране:)

Отговор