Wszystkie operatory C ++, z którymi pracowałem, zwracają coś, na przykład +
operator zwraca wynik dodawania.
Czy wszystkie operatory C ++ zwracają coś, czy też istnieją operatory C ++, które nic nie zwracają?
Wszystkie operatory C ++, z którymi pracowałem, zwracają coś, na przykład +
operator zwraca wynik dodawania.
Czy wszystkie operatory C ++ zwracają coś, czy też istnieją operatory C ++, które nic nie zwracają?
+=
powrót void
, ale nie jest to zalecane. Również operatorzy wywołań funkcji mogą powrócić void
i jest to ważne
::
nic nie zwraca, ale musiałbym sprawdzić standard, aby się upewnić.
Odpowiedzi:
Chociaż prawdopodobnie nie są one dokładnie tym , o czym myślisz, zwróć uwagę, że „słowa kluczowe” delete
i delete[]
C ++ są w rzeczywistości operatorami ; i są zdefiniowane jako mające void
typ zwracany - co oznacza, że wartościowane do niczego (co nie jest „czymś”).
Od cppreference :
void operator delete ( void* ptr ) noexcept;
void operator delete[]( void* ptr ) noexcept;
delete
, delete[]
, throw
, (void)x;
Obsada, z lewej strony ,
operatora, po prawej stronie ,
operatora, który daje void
, A ?:
trójskładnikowy, który używa throw
jednego z ramion, dfri jest operator void()
(co będzie określone przez użytkownika),眠りネロクjest void operator()()
(zdefiniowana co byłoby użytkownika).
delete
operator niszczy obiekt, a następnie wywołuje operator delete
. Ergo, delete
operator i operator delete
są oddzielnymi rzeczami :( stackoverflow.com/a/8918942/845092
operator delete
.
Operatorzy niestandardowych typów mogą być przeciążeni, aby robić najdziwniejsze rzeczy.
na przykład operator + zwraca wynik dodawania.
Niekoniecznie:
#include <iostream>
struct foo {
int value = 0;
void operator+(int x) {
value += x;
}
};
int main () {
foo f;
f + 3;
}
Tutaj operator+
dodaje lewą stronę do elementu value
członkowskiego, a jego zwracany typ jest nieważny. To jest zmyślony przykład, ale generalnie nie zwracanie czegoś od operatora niestandardowego nie jest niczym niezwykłym.
Jedynym operatorem, który może być przeciążony i który wymaga zwrócenia czegoś, o czym jestem świadomy, jest operator->
. Musi zwracać surowy wskaźnik lub obiekt, który ma rozszerzenie operator->
.
operator->
jest trochę specjalne i musi zwrócić wskaźnik lub obiekt, który ma operator->
, nie jestem pewien, czy są inne wyjątki
operator*(Matrix const& left, Matrix const& right)
nie zwraca, Matrix
ale zamiast tego MatrixMul
, tak że jeśli jest następnie wprowadzana do operator+(Matrix const& left, MatrixMul const& right)
operacji, może być połączonym mnożeniem i dodawaniem, co jest bardziej wydajne niż najpierw mnożenie, a następnie dodawanie.
<<
i >>
są przeciążone, oczekuje się, że zwrócą strumień, aby można było je kaskadować:stream << foo << bar;
Operatorzy nic nie zwracają. To tylko elementy leksykalne, których używamy do tworzenia wyrażeń w języku. Teraz wyrażenia mają typy i mogą być obliczane na wartości i zakładam, że to właśnie masz na myśli, mówiąc o operatorach „zwracających rzeczy”.
I cóż, tak. Istnieją wyrażenia C ++ z typem void
(w związku z czym nie dają żadnej wartości). Niektóre są oczywiste, inne mniej. Dobrym przykładem może być
throw std::runtime_error()
throw
jest wyrażeniem w gramatyce C ++. Możesz go używać w innych wyrażeniach, na przykład w wyrażeniu warunkowym
return goodStatus() ? getValue() : throw std::runtime_error();
A typ wyrażenia rzut to void
. Oczywiście, ponieważ powoduje to po prostu szybkie przejście w inne miejsce, wyrażenie nie ma wartości.
Żaden z wbudowanych operatorów C ++ niczego nie zwraca . Przeciążone operatory C ++ zwracają coś, o ile notacja operatora jest cukrem składniowym dla wywołania funkcji.
Raczej wszyscy operatorzy oceniają coś. To coś ma dobrze zdefiniowaną wartość, a także typ . Nawet operator wywołania funkcji void operator()(/*params*/)
jest void
typem.
Na przykład +'a'
jest int
typem o wartości 'a'
zakodowanej na Twojej platformie.
Jeśli Twoje pytanie brzmi „Czy operatory C ++ mogą mieć void
zwracany typ?” wtedy odpowiedź brzmi z całą pewnością tak.
I++
nie zwraca wartości. Jeśli typ i
jest typem zdefiniowanym przez użytkownika, to wyrażenie jest implementowane jako operator++
funkcja, która zwraca wartość. Nazywasz to „cukrem syntaktycznym”; Nazywam to rozróżnieniem, które ma ważne konsekwencje.
W rzeczywistości można zdefiniować operator wywołania funkcji, aby nic nie zwracał. Na przykład:
struct Task {
void operator()() const;
};
Możesz określić osobliwy operator void()
funkcji konwersji, gdzie kompilator będzie nawet cię ostrzec, że T
do void
funkcji konwersji nigdy nie zostaną wykorzystane :
#include <iostream>
struct Foo {
operator void() { std::cout << "Foo::operator void()!"; }
// warning: conversion function converting 'Foo' to
// 'void' will never be used
};
int main() {
Foo f;
(void)f; // nothing
f.operator void(); // Foo::operator void()!
}
zgodnie z [class.conv.fct] / 1
[...] Funkcja konwersji A nigdy stosowane do konwersji (ewentualnie CV zastrzeżeniami) przedmiotu do tego typu obiektu (ewentualnie CV zastrzeżeniami) (albo w odniesieniu do niej) do (ewentualnie cv wykwalifikowany) klasy bazowej tego typu (lub odniesienie do niego) lub do (prawdopodobnie kwalifikowane jako cv)
void
. 117( 117 ) Te konwersje są uważane za konwersje standardowe do celów rozwiązania problemu z przeciążeniem ([over.best.ics], [over.ics.ref]), a zatem inicjalizacji ([dcl.init]) i rzutów jawnych. Konwersja do
void
nie wywołuje żadnej funkcji konwersji ([wyrażenie.static.cast]). Chociaż nigdy nie są bezpośrednio wywoływane w celu wykonania konwersji, takie funkcje konwersji mogą być zadeklarowane i potencjalnie mogą być osiągnięte przez wywołanie wirtualnej funkcji konwersji w klasie bazowej.
Chociaż jednak, jak pokazano powyżej, nadal można go wywołać przy użyciu jawnej .operator void()
składni.
Operatory zdefiniowane (wbudowane) przez język to tokeny używane do wykonywania różnego rodzaju obliczeń:
i tak dalej. Lista może być bardzo obszerna.
W odniesień językowych, takich jak ta, lub ten , te niekoniecznie są oznaczone jako powrocie coś, po prostu wykonywania arytmetyczne lub logiczne działanie , przez porównanie, co oznacza zmienną mogą być modyfikowane, etc.
Ponieważ ta operacja daje pewną wartość, może być zinterpretowana jako „zwrócona” przez operator, ale różni się od wartości zwracanej przez funkcję.
Z drugiej strony, przeciążone operatory można zdefiniować za pomocą wartości zwracanej pewnego typu, nawet jeśli może to być wartość void, więc nie, nie wszystkie operatory zwracają jakąś wartość w C ++.
Zakładam, że mówisz o funkcjach operatora, a nie o operatorach jako jednostce składniowej języka.
Jeśli przeciążasz operatory dowolnego typu, możesz w rzeczywistości zwrócić, co chcesz.
Ma to również duży sens, ponieważ operacje takie jak * lub () mogą czasami bardzo intuicyjnie nie zwracać typu danych wejściowych. Wyobraź sobie, że mnożymy typ liczb zespolonych przez typ liczb rzeczywistych. Lub operator, który zwraca element z kolekcji.
Możesz również przeciążać operatory ++ i -, aby nic nie zwracały, usuwając w ten sposób wyjątkowo podatne na błędy mieszanie efektu ubocznego i wartości wyrażenia, które ma wersja standardowa.
Nie. Rozważ te dwa przykłady tutaj:
int multiply (int a, int b) {
return a*b;
}
void multiply_void(int a, int b) {
cout << a*b;
//or cout << multiply(a,b);
}
Pierwsza funkcja zwróci wartość całkowitą, której może użyć inna funkcja. Wartość jest zwracana i zapisywana w pamięci do wykorzystania w razie potrzeby. Jeśli nie, nie jest to widoczne dla człowieka i po prostu szczęśliwie pozostaje w pamięci.
Druga funkcja wyprowadzi dane do domyślnego urządzenia wyjściowego (zwykle konsoli). Wartość zwracana przez operator mnożenia jest przekazywana do urządzenia wyjściowego. Funkcja multiply_void nie zwraca rzeczywistej wartości.
Operatorzy sami nie zawsze nic zwracają. Wywołania funkcji zwracają wartości. Operatory mogą dawać wartości. Operatory mogą czasami wywoływać funkcje. Przykłady zawierają:
• Operator wywołania funkcji.
• Przeciążony operator, który zostaje przekształcony w wywołanie funkcji.
• operator new, który jest wywoływany jako część nowego wyrażenia , jest wywołaniem funkcji.
Moim jedynym celem przy wspominaniu wywołań funkcji jest wyjaśnienie wyniku w stosunku do zwrotu. Opierając się na analizie wszystkich 126 wystąpień wyrażenia „return” i wyprowadzonych z niego słów w [wyraż] , sekcja wydaje się uważnie używać słowa return w odniesieniu do:
• wynik wywołania funkcji
• aspekty przepływu kontroli związane z programami
OK, wystarczy pedanterii w kwestii wyniku vs. zwrot.
Operatory C ++ zwracają coś lub nie, zależy od tego, jak ich użyłeś. Wbudowane operatory C ++ zwracają pewną wartość, dopóki nie zostaną wymuszone, aby zwrócić void.