Vrácení reference z funkce v C ++

Autor: John Paul Mueller, Jeff Cogswell

tableta azithromycinu 250 mg

Je možné vrátit referenci z funkce. Ale buďte opatrní, když se o to pokusíte: Nechcete v rámci funkce vrátit odkaz na lokální proměnnou - protože když funkce skončí, úložný prostor pro lokální proměnné zmizí. Špatný!

Ale můžete vrátit odkaz na globální proměnnou. Nebo pokud je funkcí členská funkce, můžete vrátit odkaz na členskou proměnnou.



Například zde je třída, která má funkci, která vrací odkaz na jednu z jejích proměnných:

class DigInto { private: int secret; public: DigInto() { secret = 150; } int &GetSecretVariable() { return secret; } void Write() { cout << secret << endl; } };

Všimněte si, že konstruktor ukládá 150 vtajnýproměnná, která je soukromá. TheGetSecretVariable ()funkce vrací odkaz na privátní proměnnou s názvemtajný. ANapsat()funkce vypíše hodnotutajnýproměnná. Spousta tajemství zde! A také několik překvapení. Tuto třídu můžete použít takto:

int main(int argc, char *argv[]) { DigInto inst; inst.Write(); int &pry = inst.GetSecretVariable(); pry = 30; inst.Write(); return 0; }

Když toto spustíte, zobrazí se následující výstup:

150 30

První řádek je hodnota v tajné proměnné hned poté, co aplikace vytvoří instanci. Ale pozorně se podívejte na kód: Volaná proměnnávypáčitje odkaz na celé číslo a získá výsledkyGetSecretVariable (). A jaký je ten výsledek?

Je to odkaz na privátní proměnnou s názvemtajný- což znamená, ževypáčitsama o sobě je nyní odkazem na tuto proměnnou. Ano, proměnná mimo třídu nyní odkazuje přímo na soukromého člena instance! Poté jste nastavilivypáčitdo 30. Když voláteNapsat()opět se soukromá proměnná skutečně změní.

Vypadá to jako špatný nápad? Proměnnou nastavíte jako soukromou. A teďGetSecretVariable ()funkce do značné míry vymazala jakýkoli smysl proměnné, která ve skutečnosti zůstává soukromá. Thehlavní()funkce byla schopna chytit odkaz na něj a hrabat se kolem a změnit jej, jak chtěla, jako by to nebylo soukromé! Problémy v zemi C ++!

To je problém s odkazy: Mohou potenciálně nechat váš kód dokořán. Proto si před vrácením odkazu na proměnnou dvakrát rozmyslete. Zde je jedno z největších rizik: Někdo jiný může tento kód používat, nemusí rozumět odkazům a nemusí si uvědomit, že proměnná s názvemvypáčitmá přímý odkaz na soukrométajnýproměnná.

Takový nezkušený programátor by pak mohl napsat kód, který používá a mění sevypáčit- aniž by si uvědomil, že se proměnná člena spolu s ní mění. Později pak a Chyba výsledky - docela ošklivý!

Protože funkce, které vracejí reference, mohou zanechat nic netušící a méně zkušené programátory v C ++ s příliš malým výkonem na rukou, buďte s odkazy opatrní. Ne, nemusíte se jim úplně vyhýbat; jen buď opatrný. Používejte je, pouze pokud opravdu cítíte, že musíte. Ale pamatujte také, že lepší přístup ve třídách je mít členské přístupové funkce, které mohou chránit soukromé proměnné.

Odkazy však mohou být velmi silné, pokud pochopíte, co dělají. Když použijete odkaz, můžete snadno upravit jinou proměnnou, aniž byste museli procházet ukazateli - což vám někdy může život mnohem usnadnit. Takže prosím: Používejte své nově nabyté síly opatrně.