2014-12-17 10 views
5
#include <iostream> 
#include<stdlib.h> 
using namespace std; 

class test{ 
    public: 
    test(int a):i(a){ 
    } 
    int display(); 
    private: 
     int i; 
}; 

int test::display(){ 
    i; 
} 
int main() { 
    test obj(10); 
    cout<<obj.display(); 
    return 0; 
} 

W powyższym przykładzie drukowana jest wartość losowa. Ale kiedy zmienił deklarację funkcji jak:Przypadkowo zapomniałem zwrócić wartość z funkcji, ale kiedy zwróciłem referencję w deklaracji funkcji zadziałało. Dlaczego?

int& display(); 

i definicji, jak:

int& test::display(){ 
    i; 
} 

ona wyświetlana prawidłowa wartość to 10 nie wiem dlaczego?

+9

Jest to niezdefiniowane zachowanie. Twój kod ma błąd, robi coś nieoczekiwanego. – juanchopanza

+1

Powiązany z [Dlaczego ten fragment kodu C++ kompiluje (funkcja non-void nie zwraca wartości)] (http://stackoverflow.com/q/20614282/1708801) –

Odpowiedz

7

Jest to niezdefiniowane zachowanie, więc wszystko jest możliwe - w tym możliwość, gdy kod "działa" zgodnie z oczekiwaniami. Twój kompilator powinien wydać ostrzeżenie o tym - ważne jest, aby traktować takie ostrzeżenia jako błędy i naprawić wszystkie zgłoszone problemy przed testowaniem kodu.

Kompilatory używają rejestrów stosu lub procesora do zwracania wartości z funkcji. Gdy brakuje wartości return, żadne dane nie są umieszczane w obszarze wartości zwracanej. Jednak dane, które zamierzasz zwrócić, mogą już znajdować się w rejestrze lub na stosie w odpowiednim miejscu, więc kod wywołujący zachowuje się tak, jak się spodziewasz. Pozostaje jednak niezdefiniowany.

Powiązane problemy