Re: [LUGOS] c++ vprašanje

Gregor Berginc gregor.berginc at gmail.com
Thu Mar 16 07:41:32 CET 2006


Zivjo,

> > Torej, znamka() vrne znamko avtomobila. Tukaj mi nekaj pravi, da vračam
> > const String. Ampak, kako bi bilo pa lahko drugače?
> Meni pa nekaj pravi, da je funkcija const, vraca pa pac navaden string.

Ne, funkcija bi bila const, ce bi imela naslednji prototip:

String znamka() const
{
}

V tem primeru ne bi mogel spreminjati nobenega razrednega atributa
(razen mutable atributov).

Test pravi, da je res povsem nepomembno, ali imas const spredaj ali
ne... Naceloma je to razumljivo, ker vracas kopijo objekta, torej ne
vracas kazalca oz. reference na razredno spremenljivko.

Vsekakor pa se stvar MOCNO spremeni, ce vracas referenco, npr.:

const String& znamka() const
{
}

Nekaj moras se paziti. To funkcijo lahko uporabis na dva nacina:

(1) String str = avto.znamka();
(2) String str& avto.znamka();

V primeru (1) se stvar popolnoma nic ne spremeni, se vedno se ti
ustvari kopija (vsaj, kolikor je mene zadevalo:)). V drugem primeru pa
dobis referenco na razredno spremenljivko! Ce sedaj poskusas niz
spremeniti (beri: ce nad spremenljivko 'str' poklices kako non-const
funkcijo, se ti bo prevajalnik pritozeval!!!).

Spodaj sem ti pripel se en delcek kode, ki ga bos moral malo
spremeniti, da ti bo delal:

class A
{
	public:
		A(vcl_string _str) : str_(_str) { };
		vcl_string str_;

		const vcl_string& const_str() { return this->str_; }
		vcl_string& str() { return this->str_; }
}; // class A

int main()
{
	A a("hello world");

	vcl_string str = a.str();
	vcl_string const_str = a.const_str();

	str = "non-const";
	const_str = "const";

	vcl_cout << str << vcl_endl;
	vcl_cout << const_str << vcl_endl;
	vcl_cout << a.str() << vcl_endl;
	vcl_cout << a.const_str() << vcl_endl;
	return 0;
}

Da se ti bo sploh prevedlo moras spremeniti vcl_string v svoj String
ter na koncu spremeniti izpis. Ta koda se bo prevedla, ker ne
uporabljas referenc. Potem zamenjaj vrstici:

	vcl_string str = a.str();
	vcl_string const_str = a.const_str();

z (bodi pozoren na reference)

	vcl_string& str = a.str();
	vcl_string& const_str = a.const_str();

To se ne bi smelo prevesti...

Upam, da ti bo kaj pomagalo... Zapomni si le, da vracanje const
vrednosti res nima smisla, ker vrednost se vedno kopira! Pri kazalcih
in referencah pa je seveda drugace! Ravno zato je dobro, da funkcije,
ki ne spreminjajo razrednih spremenljivk (razne getterji) deklariras
kot const funkcije!

lp,
Gregor

--
Gregor Berginc, Ph.D. Student
University of Ljubljana, Faculty of CIS
Trzaska 25, SI-1001 Ljubljana, Slovenia
tel: +386 1 4776630, fax: +386 1 4264647
www: http://vicos.fri.uni-lj.si/gregor


More information about the lugos-list mailing list