[ azzpoz @ 13.11.2013. 16:50 ] @
Code:
#include <iostream>
using namespace std;

class tacka
{     
      
      
      public:
             int x, y, z;
         tacka(int _x=0, int _y=0, int _z=0)
             {
                       x = _x;
                       y = _y;
                       z = _z;
             }
tacka(tacka & original)
             {
                        x = original.x;
                         y = original.y;
                         z = original.z;
                        
             } 
             
             
             friend tacka operator+ (tacka, tacka);

void info(){cout<<" "<<x<<" "<<y<<" "<<z<<endl;  }           
             
};

tacka operator+(tacka lijevi, tacka desni)
{
                      int x = lijevi.x + desni.x;
                      int y = lijevi.y + desni.y;
                      int z = lijevi.z + desni.z;
                      
                      tacka tmp(x, y, z);
                      
                      return tmp;
}


int main()
{
    tacka a(1,1,1);
    tacka b(2,2,2);
    
    tacka c = a+b;  // zasto ne moze ovako
   
    c.info();
    system("pause>0"); return 0;
}



Program će raditi BEZ "konstruktora kopije" koji sam sam definisao!!!
Koliko kapiram' izvrši se a+b, vrati se tmp iz funkcije za preklapanje operatora, i nakon toga se pozove konstruktor kopije(tmp)," koliko sam razumio, ali ne ide..."
[ Burgos @ 13.11.2013. 17:21 ] @
Code:
tacka(tacka & original)


ovo nije konstruktor kopije. Konstruktor kopije je:

Code:
tacka(const tacka& original)

[ azzpoz @ 13.11.2013. 18:05 ] @
Zašto konstruktor kopije radi na drugim programima i bez const???

Korisnik "ne bi" trebao namjerno promijeniti atribute objekta?!


P.S. Hvala za pomoć

[Ovu poruku je menjao azzpoz dana 13.11.2013. u 19:51 GMT+1]
[ Burgos @ 13.11.2013. 19:07 ] @
Ja se izvinjavam, moja brzopletost je u pitanju, u oba slučaja je konstruktor kopije u pitanju (može još da bude volatile tacka& ili const volatile tacka&).

Ono što je zanimljivo ovde je da ne možeš inicijalizovati ne-konstantnu referencu privremenim objektom (ono što vraća operator+), tj. ne bi mogao da to proslediš ni nekoj funkciji u tacki sa istim argumentima:

Code:

class tacka{
 ...
 void foo(tacka& t){}

 ...


}

tacka c;
c.foo(a + b); // ne radi

// ili - svodi se na isto 
int& i = 1 + 2; // ne radi
const int& i = 1+ 2; // radi



Da još napomenem, u operator+, prosledi a i b kao const tacka&, da bi sprečio moguće kopiranje.

Evo i citat Bjarna, što je najbliže što mogu da nađem pravom "tehničkom" razlogu (zaštita programera od grešaka):

Citat:
References to variables and references to constants are distinguished because introducing a temporary for a variable would have been highly error-prone; an assignment to the variable would become an assignment to the - soon to dissappear - temporary. No such problem exists for references to constants.





[Ovu poruku je menjao Burgos dana 13.11.2013. u 20:35 GMT+1]