Chcę się upewnić, że rozumiem poprawnie wartość przekazywaną w stosunku do przekazywanej referencji. W szczególności zajmuję się przedrostkami/postfiksami operatora przyrostowego ++
dla obiektu.Operatory przyrostków prefiks/Postfiks
Załóżmy mamy następujące klasy X
:
class X{
private:
int i;
public:
X(){i=0;}
X& operator ++(){ ++i; return *this; } //prefix increment
X operator ++ (int unused){ //postfix increment
X ret(*this);
i++;
return ret;
}
operator int(){ return i; } //int cast
};
Przede wszystkim, ja wdrożył prefiksu/operatorów Postfix przyrostu prawidłowo?
Po drugie, jak wydajna pamięć jest operatorem przyrostowym, w porównaniu do operatora prefiksu? W szczególności, ile kopii obiektów obiektu X
jest tworzonych, gdy używana jest każda wersja operatora?
Dokładne wyjaśnienie tego, co dzieje się z funkcją powrotu do referencji a funkcją powrotu do wartości, może mi pomóc w zrozumieniu.
Edit: Na przykład za pomocą następującego kodu ...
X a;
X b=a++;
... A i B są teraz aliasy?
Nie ma potrzeby zwiększania przyrostowego "i" w operatorze przyrostkowym. W rzeczywistości robiłbym to, co [FredOverflow sugeruje] (http://stackoverflow.com/questions/3181211/3181359#3181359) i wywoływał wersję prefiksu. IMO jest rzeczywiście bardziej idiomatyczna niż ponowne wdrażanie inkrementacji (nawet jeśli implementacja jest tu banalna). _ I pozbądź się tego niejawnego operatora konwersji. To będzie cię bolało inaczej. (Trzeci i ostatni raz, kiedy napisałem niejawnego operatora konwersji, był w 2001 r., A rok czy dwa lata później odkryłem, że spowodował on subtelne błędy i usunął je - jak wszystkie wcześniej. BTDTGTLS.) – sbi