Bu kod çalıştığından bir C++ sorun (veya orada yok) karşılaşıyorum, ancak nedenini bilmiyorum.C++ içinde yerel bir değişken döndürüyor
Bağlam için, profesörüm bize bir başlık dosyası verdi ve ana işlev, program bir Fibonnaci Sırası oluşturur.
Diziyi, ++ a ve a ++ kullanarak yinelemek için bir yineleyici kullanıyorum.
İşte benim için bir ++ uygulaması var.
FibonacciIterator FibonacciIterator::operator++(int) //i++, increment i, return old i.
{
FibonacciIterator old = *this; //create old object to return
//increment actual fibonacci sequence
long nextTemp = fCurrent + fPrevious;
fPrevious = fCurrent;
fCurrent = nextTemp;
fCurrentN++; //increment count
return old;
}
Şimdi, pointer 'bu' ait KQUEUE operatörünü kullanarak, 'eski' bir değer yaratmak. Geçerli yineleyiciye biraz mantık yapıyorum ve eski yineleyiciyi döndürüyorum.
Bu tüm inşaat ve döngü do-while aşağıdakileri kullanarak:
FibonacciIterator lIterator2 = lIterator.begin();
do
{
cout << *lIterator2++ << endl;
} while (lIterator2 != lIterator2.end());
her şey çalışıyor. Bu do-while döngüsü profesör tarafından yazılır, biz onu değiştirmek niyetinde değiliz.
Sorum şu, bu kod neden çalışıyor? Anlayışımda, bir yöntemde yerel bir değişken oluşturduğumuzda, bu değişken yöntem yığını çerçevesinde korunur. Yığın çerçevesinden çıktığımızda, o yığın çerçevesinde oluşturulan yerel bir değişkeni döndürmeliyiz, değerinizi alabiliriz. Ayrıca olmayabiliriz. Anlayışımın nedeni, bu değişkenin oluşturulduğu bellek konumunun, bilgisayarda ihtiyaç duyabilecek herhangi bir program tarafından "kapmak için" kalmasıdır. Yani istediğimiz değeri alırsak, bunun hiçbir şey üzerine yazılmadığı için. Eğer yapmazsak, onun bir şey üzerine yazdığı için.
Peki neden bu kod çalışıyor, zamanın% 100'ü? Neden SOMETIMES'in eski olduğunu görmek için çöp alıyorum ve programımı işlenmemiş bir istisna ile çarpıyorum? Tek düşüncem şudur: 'FibonacciIterator' kullanıcı tarafından oluşturulan bir sınıftır, OTOMATİK OLARAK bellekte ayrılmış bellek vardır, bu nedenle bu problemle karşılaşmazız. Tek düşüncem bu sorunun yalnızca int, long, double, vb gibi türleri kullanarak var olması olabilir.
Ancak, tahminimin yanlış olduğunu% 99 eminim ve burada neler olduğunu anlamak istiyorum. . Bunu anlamak istiyorum çünkü bir tane için C++ 'ya hoşlanıyorum ama neden bir şeyler çalıştığını bilmekten zevk alamıyorum.
Teşekkür ederiz!
(kopya "güvenli" olması gerektiğini tüm uyarılar ile) Tamam, bu nedenle kopyalanır ve Bu durumda döndürülen sonuç, söz konusu Bildirimin sonlanan noktalı virgülüne (;) kadar kapsamı olan geçici bir nesne içinde depolanır. yani döndürülmüş değer, cout << * lIterator2 ++ << endl'in sonlanan noktalı virgülüne kadar bir kapsama sahiptir; –