Soru Bir işlev bildiriminin dönüş türündeki işareti ve işareti nasıl çalışır? [çift]


Bu sorunun zaten bir cevabı var:

Bu kod parçasında, f () niçin "double & f (..." olarak bildirilir?) Ne anlama gelir ve nasıl çalışır? Sorunun cevabını bulmak için google'a ne yapacağımı bile bilmiyorum. Lütfen yardım et.

double a = 1, b = 2;
double & f (double & d) {
    d = 4;
    return b;
}

Ve işareti ve işaretin bir değişkenin ya da fonksiyonun adresi anlamına geldiğini biliyorum, fakat bir işlevi açıklarken bunu yazmanın neden mantıklı olduğunu anlamıyorum.


17
2018-02-27 07:48


Menşei


Hayır. Sizin durumunuzdaki (bu bağlamda) ve işareti bir referansı gösterir. - Mark Garcia
Dahası ve işareti bir referansı gösterir. her Bu kod snippet'indeki görünüm. - WhozCraig
Btw, "bu işlev" veya "bu kod" kelimelerini içeren başlıklar pek kullanışlı değildir. Benzer bir sorusu olan ve bunu SO içinde bulmak isteyen gelecekteki kullanıcıları düşünün. Tıpkı sizin aradığınızı bulamadığınız gibi. Elde ettikleri problem en çok "dönüş türünde" ve "benzer" olarak tanımlandığında "bu işlev" için arama yapmaları olası değildir. - jogojapan
@jogojapan Başlığı değiştirdi, öneri için teşekkürler. - Azad Salahli


Cevaplar:


Ne zaman & Operatör bir bildirim formunda kullanılır, bir türden önce "adresi" anlamına gelmez, ancak temelde otomatik olarak engelli işaretçi aritmetiği olan bir işaretçiyi işaret eden bir "başvuru" anlamına gelmez.

C'de referans yoktur, bu nedenle referans olarak iletmek veya geri dönmek isterseniz, bir const işaretçisini ve sivri olan değere erişebilmek için dereferansı iletmeniz gerekir. C ++, bu konsepti daha kolay hale getirmek, işaretçi aritmetiği ile adresin yanlışlıkla okunmasını önlemek ve işaretçiyi yok etme gereksinimini kaydetmek için referanslar ekledi. Bu, onunla çalışmayı çok daha kolay hale getirir ve daha temiz ve okunabilir sözdizimi ile sonuçlanır.


13
2018-02-27 08:03





Bu iki işlevi göz önünde bulundurun: power2() ve add():

void power2 (double& res, double x) {
    res = x * x;
}

double& add (double& x) {
    return ++x;
}

Birincisi gücü hesaplar x ve sonucu ilk argümanda saklar, res- iade etmesine gerek yok.

İkincisi bir referans döndürür, bu da bu referansın daha sonra yeni bir değer atanabileceği anlamına gelir.

Örnek:

    double res = 0;

    power2(res, 5);
    printf("%f\n", res);


    printf("%f\n", ++add(res));

Çıktı:

25.000000
27.000000

Lütfen ikinci çıkışın 27değil, 26 - kullanımı nedeniyle ++ içinde printf() aramak.


21
2018-02-27 08:03



Beton örnekleri için +1 - jogojapan
Kaba olmaya çalışmıyorum, ama bu örneği anlamak zor - puk
@puk Hiç de kaba değil. Daha sindirilebilir hale getirmek için bir fikir önermiş olsaydın daha yararlı olurdu. Bu cevabı düzenlemek için mantıklı olmayacak kadar basit bir yol olduğunu düşünüyorsanız, kendi cevabınızı da gönderebilirsiniz. - kamituel


Bu durumda, ve işareti değil Bir adres almak demek, ancak bir referans anlamına gelir. İşte, f parametre olarak çifte referans alan ve çifte referans döndüren bir işlevdir.

Dilin çok temel bir parçası olduklarından, seçtiğiniz ders kitabında C ++ 'nın referanslarını okumak isteyebilirsiniz.


6
2018-02-27 07:51