Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: clase  (Citit de 1688 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
witsel
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 15



Vezi Profilul
« : Decembrie 13, 2014, 12:30:57 »

de ce imi afiseaza valorile in ordinea inversa a obiectelor apelate?? adica eu ma asteptat sa imi afiseze ceva de genul
width=2 height=4
width=6 height=8
width=1 height=2
width=2 height=1
Asta se intampla doar daca apelez din cout, daca nu imi afiseaza in ordinea lor normala. imi poate spune cineva de ce se intampla asta??
P.S: Scuze, dar nu stiu cum sa atasez tip code asa ca  pentru cei care nu vor sa download-eze un fisier am copiat aici programul..

#include <iostream>

using namespace std;
int i;
class Rectangle
{
    int width,height;
public:
    Rectangle (int a,int b)
    {   width=a;
        height=b;
    }
    Rectangle ()
    {
        int x,y;
        cout<<" width= ";cin>>x;
        cout<<" height= ";cin>>y;
        cout<<"\n";
        width=x;
        height=y;
    }
    Rectangle (int x) {width=x; height=1;}
    int area()
    {
        cout<<" width= "<<width;
        cout<<" height= "<<height;
        cout<<" i= "<<++i;
        cout<<" \n";
        return width*height;
    }
    void set_values(int x,int y) {width=2*x; height=2*y;}
    void set_values1() {set_values(width,height);}
}rect,rectb;

int main()
{

    rectb.set_values1();
    rect.set_values1();
    Rectangle rectd(2),rectc(1,2);
    cout<<rect.area()<<" "<<rectb.area()<<" "<<rectc.area()<<" "<<rectd.area();
    return 0;
}
« Ultima modificare: Decembrie 13, 2014, 12:45:11 de către Witsel Andrei » Memorat
Owlree
Strain
*

Karma: 16
Deconectat Deconectat

Mesaje: 27



Vezi Profilul
« Răspunde #1 : Decembrie 13, 2014, 23:45:07 »

Ceea ce ai scris tu acolo în C++ este undefined behaviour.

>> și << sunt operatori, iar în C++ nu există conceptul de evaluare de la dreapta la stânga sau de la stânga la dreapta, deci mai clar nu există conceptul de ordinea evaluării. A nu se confunda cu asociativitatea operatorilor de la stânga la dreapta sau de la dreapta la stânga.

f() + g() + h() se evaluează ca (f() + g()) + h(), dar h() s-ar putea să fie funcția evaluată prima, și abia după să se treacă la paranteză.

În altă ordine de idei, când programezi cu side effects, încearcă să nu apelezi două funcții în aceeași expresie, mai ales dacă este importantă ordinea în care ele sunt apelate.

Uite un exemplu. Eu când compilez cu g++-4.9, codul
Cod:
int i = 0;
cout << i << " " << i++ << "\n";
îmi afișează 1 0. Cu toate astea, nu este indicat să te bazezi pe exemplul ăsta, încearcă să găsești altă soluție.

Un alt exemplu interesant.
Cod:
int i = 0;
if (++i || ++i) {

}
cout << i << "\n";
afișează 1, pe când
Cod:
int i = 0;
if (i++ || ++i) {

}
cout << i << "\n";
afișează 2. Motivul este acela că atunci când ai un sau logic între doi operanzi, este suficient ca primul operand să fie evaluat ca adevărat pentru ca expresia să fie evaluată și ea ca fiind adevărată. Prin urmare, dacă primul operand este adevărat, cel de-al doilea nici nu se mai evaluează deoarece se cunoaște valoarea expresiei deja. În caz contrar, dacă primul operand se evaluează ca fals, atunci este necesară și evaluarea celui de-al doilea operand. Aici, cu toate că avem o expresie cu doi operanzi și un operator, ordinea evaluării lor este definită. Mai exact, într-o expresie de forma să zicem a || b există un sequence point după a. Existența unui sequence point denotă faptul că toate side effect-urile evaluărilor precedente trebuie să fie terminate și că nici un side effect al vreunei evaluări ulterioare nu a avut loc.
Memorat
witsel
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 15



Vezi Profilul
« Răspunde #2 : Decembrie 14, 2014, 10:49:19 »

am inteles, mersi pentru explicatie
Memorat
darkusdharak
Strain


Karma: -3
Deconectat Deconectat

Mesaje: 2



Vezi Profilul
« Răspunde #3 : Decembrie 19, 2014, 15:51:32 »

buna ziua,
scuzati daca am gresit topicul Smile
am o problema la crearea unei clase cu urmatoarele componente si ma intrebam daca ma puteti ajuta la sursa codului :
•   constanta PI
•   constructorul care acceptă două valori întregi, operand1 şi operand2
•   metoda pentru scrierea valorilor operand1 şi operand2
•   metodele pentru cele patru operaţii de calcul - adunare, scădere, împărţire şi înmulţire care vor returna rezultatul operaţiei asupra valorilor operand1 şi operand2
•   metode statice pentru aceste operaţii, care acceptă operanzii drept parametri
•   metoda suprafaţa cercului care calculează suprafaţa cercului cu diametrul operand1.
Creați o aplicaţie de consolă care instanţiază obiectul clasei Calculator, apelează toate metodele şi scrie rezultatul calculului.

Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines