Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Preklapanje operatora

[es] :: C/C++ programiranje :: Preklapanje operatora

[ Pregleda: 2882 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bunika

Član broj: 83295
Poruke: 13
*.broadband.blic.net.



Profil

icon Preklapanje operatora21.02.2007. u 17:32 - pre 209 meseci
pozdrav,
imam par pitanja vezanih za preklapanje operatora. naime, dosao sam do jednog dijela koji me, vise ni sam ne znam zasto, konstantno zbunjuje. pocecu od referenci. koliko sam shvatio, reference su u stvari konstantni pointeri koji su automatski dereferencirani. tako da se prilikom prenosenja reference u funkciju, na stek kopira adresa, a ne citav objekat. dok u slucaju da zelimo proslijediti objekat po vrijednosti, koristimo konstruktor kopije. medjutim, nije mi jasno sta se u stvari desava kada je povratna vrijednost funkcije referenca? u slucaju, da je povratna vrijednost pointer na neki tip, iz funkcije prenosimo adresu koju mozemo prihvatiti nekim pokazivacem na taj isti tip, pa dereferenciranjem pristupiti sadrzaju memorijske lokacije. ali sta se desava kada iz funkcije vracamo referencu? sta u stvari vracamo? adresu ili objekat?
primjer iz knjige, preklapanje operatora dodjele za klasu complex:

Complex& Complex::operator=(const Complex &z){
r=z.r;
i=z.i;
return *this;
}

pise da se referenca koristi da bi kompletan izraz bio lvrijednost, plus, da bi se izbjegao konstruktor kopije. prvo, nije mi jasno zasto se mora koristiti referenca da bi izraz bio lvrijednost, a drugo, sta se u stvari desava u memoriji pri pozivu ovakve funkcije? nadam se da nisam unio tonu konfuzije, posto ni sam ne znam tacno definisati sta mi nije jasno. nadam se da ce mi neko razjasniti ove stvari. unaprijed zahvalan.
pz
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Preklapanje operatora22.02.2007. u 09:26 - pre 209 meseci
Obrati pažnju na funkciju f() u klasi MyString. Ona vraća referencu na string unutar klase i omogućuje da se dodeli vrednost povratnoj vrednosti funkcije u liniji (1), tj. da se izmeni privatan član klase. Ako ukloniš referencu, onda ovakva dodela nema dejstva, tj. privatan član klase nije promenjen.
Code:
 
#include <iostream>
#include <string>

using namespace std;

class MyString
{
private:
    string s;
public:
    MyString();
    MyString(const string& ss);
    string& f();
    void print();
};

MyString::MyString() : s()
{
}

MyString::MyString(const string& ss) : s(ss)
{
}

string& MyString::f()
{
    return s;
}

void MyString::print()
{
    cout << s << endl;
}


int main()
{
    MyString t("hello");
    t.f() = "world";// (1)
    t.print();
}

f() vraća referencu na string s objekta t pomoću koje možeš da promeniš vrednost stringa s unutar objekta t. Ako f() ne bi vraćala referencu, onda bi se vratila kopirana vrednost stringa s (copy konstruktor) kojoj se onda dodeljuje vrednost. Međutim, ta dodela ne utiče na sam objekat t.
Zato i u tvom slučaju operator= vraća referencu na objekat same klase, kako bi se operator= mogao efektivno staviti na levu stranu jednakosti i zaista menjati vrednost samog objekta za koji se poziva. (operator= je funkcija kao i svaka druga, dakle ista kao i f() u ovom primeru. Namerno je stavljena f() kako bi se obratila pažnja na samu povratnu vrednost a ne na ime funkcije.)

Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

bunika

Član broj: 83295
Poruke: 13
*.broadband.blic.net.



Profil

icon Re: Preklapanje operatora22.02.2007. u 19:11 - pre 209 meseci
hvala ti na odgovoru. definitivno si mi razjasnio neke stvari. medjutim, uvijek medjutim :) :


#include "stdafx.h"
#include<iostream>
using namespace std;

class Complex{
private:
double r;
double i;
public:
Complex(double,double);
Complex operator=(const Complex&);
void print();
};

inline Complex::Complex(double rr=0, double ii=0){
r=rr;
i=ii;
}

Complex Complex::operator =(const Complex &z){
r=z.r;
i=z.i;
return *this;
}

void Complex::print(){
cout<<r<<" "<<i<<endl;
}


int _tmain(int argc, _TCHAR* argv[])
{
Complex z1(3,2), z2(5,4),z3(7,6);
z1=z2=z3;
z1.print();
z2.print();
z3.print();
cin.get();
return 0;
}


i u ovom slucaju sve funkcionise normalno iako povratna vrijednost operatorske funkcije nije referenca na sam objekat. jasno mi je da bi u ovom slucaju koristenje reference zaobislo konstruktor kopije, ali ne vidim sta ovde ne bi funkcionisalo kada je ne bi koristili? ako ti nije problem da mi to jos malo objasnis.
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.routotelecom.com.



+1 Profil

icon Re: Preklapanje operatora23.02.2007. u 08:43 - pre 209 meseci
Kao što i sam vidiš funkcioniše normalno, samo je efikasnije sa vraćanjem reference jer nema pozivanja copy kontruktora.
Umesto
Code:

z1 = z2;

posmatraj operator= kao obično pozivanje funkcije
Code:

z1.operator=(z2);

Objektu z1 dodeljuješ vrednost objekta z2 i tebe ne zanima šta ta funkcija vraća. Zapravo, operator= može da vraća i void dodela će sasvim lepo da se izvede. Čemu onda povratna vrednost? Pa ne možeš da radiš vezane dodele kao što je
Code:

z1 = z2 = z3;

ako operator= vraća void.

[Ovu poruku je menjao karas dana 23.02.2007. u 12:52 GMT+1]
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

n1tr0
Freelance
Cortanovci / NS

Član broj: 55279
Poruke: 465
*.dynamic.sbb.co.yu.

Sajt: grubicv.iz.rs


+2 Profil

icon Re: Preklapanje operatora26.02.2007. u 19:16 - pre 209 meseci
Kod ovog primera cak i nije vazno preklopiti operator dodele. Operator dodele se preklapa kod klasa sa dinamickim clanovima, i tada je dobro izbegavati konstrukor kopije preko referenci, a samim tim se u funkcije u kojima ne menjamo objekat neke klase na stek prenosi samo adresa objekta u memoriji, a ne citav objekat...
Kada imas dinamicke clanove osim operatora dodele preklapa se obavezno i copy konstruktor i destruktor.
Ovde si mogao preklopiti operator za izlaz:
Code:
friend ostream& operator<<(ostream &out,Complex x)
{
out<<x.r<<"+"<<x.i;
return out;
}

i pozivati ga sa npr.:
Code:

Complex a(1,2);
cout<<"a="<<a;
 
Odgovor na temu

[es] :: C/C++ programiranje :: Preklapanje operatora

[ Pregleda: 2882 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.