Rozumiem składnię i ogólną semantykę wskaźników w porównaniu z referencjami, ale jak mam zdecydować, kiedy bardziej lub mniej właściwe jest używanie referencji lub wskaźników w interfejsie API?
Oczywiście niektóre sytuacje wymagają jednej lub drugiej ( operator++
wymaga argumentu referencyjnego), ale ogólnie uważam, że wolę używać wskaźników (i wskaźników stałych), ponieważ składnia jest jasna, że zmienne są przekazywane destrukcyjnie.
Np. W następującym kodzie:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
Dzięki wskaźnikowi zawsze (bardziej) oczywiste jest, co się dzieje, więc w przypadku interfejsów API i tym podobnych, w których istotną kwestią jest przejrzystość, wskaźniki nie są bardziej odpowiednie niż odniesienia? Czy to oznacza, że odniesienia należy stosować tylko wtedy, gdy jest to konieczne (np. operator++
)? Czy są jakieś problemy z wydajnością jednego lub drugiego?
EDYCJA (NIEAKTUALIZOWANE):
Poza dopuszczeniem wartości NULL i radzeniem sobie z surowymi tablicami wydaje się, że wybór sprowadza się do osobistych preferencji. Zaakceptowałem odpowiedź poniżej, która odwołuje się do Przewodnika po stylu Google C ++ , ponieważ prezentują pogląd, że „Odnośniki mogą być mylące, ponieważ mają składnię wartości, ale semantykę wskaźnika”.
Z powodu dodatkowej pracy wymaganej do dezynfekcji argumentów wskaźnika, które nie powinny mieć wartości NULL (np add_one(0)
. Wywoła wersję wskaźnika i zepsuje się w czasie wykonywania), z punktu widzenia łatwości konserwacji sensowne jest używanie referencji tam, gdzie MUSI być obecny obiekt, choć szkoda stracić przejrzystość składniową.
add_one(a);
jest niejasnego, że a
zostanie zmodyfikowany? W kodzie jest napisane: dodaj jeden .
addOneTo(...)
. Jeśli nie to chcesz zrobić, spójrz na deklarację.