Пояснения к предыдущим постам:
Ссылки НЕ гарантия получения ненулевого указателя. (Хотя мы часто к ним относимся.)
В то время как ужасно плохой код, например, выводит вас из-под дерева плохой код, следующее скомпилирует и запустит: (По крайней мере, под моим компилятором.)
bool test( int & a)
{
return (&a) == (int *) NULL;
}
int
main()
{
int * i = (int *)NULL;
cout << ( test(*i) ) << endl;
};
Реальная проблема, с которой я сталкиваюсь, связана с другими программистами, далее именуемыми IDIOTS , которые выделяются в конструкторе, освобождаются в деструкторе и терпят неудачу предоставить конструктор или оператор копирования = ().
Внезапно возникает огромная разница между foo (бар BAR) и foo (BAR & bar) . (Автоматическая побитовая операция копирования вызывается. Удаление в деструкторе вызывается дважды.)
К счастью, современные компиляторы подберут это двойное освобождение одного и того же указателя. 15 лет назад они этого не сделали. (В gcc / g ++ используйте setenv MALLOC_CHECK_ 0 , чтобы вернуться к старым способам.) В результате в DEC UNIX в одной и той же памяти выделяется два разных объекта. Там много веселья для отладки ...
Практически:
- Ссылки скрывают, что вы меняете данные, хранящиеся в другом месте.
- Легко спутать ссылку со скопированным объектом.
- Указатели делают это очевидным!