Программирование. Принципы и практика использования C++ Исправленное издание, стр. 233
• Для маленьких объектов предпочтительнее передача по значению.
• Для функций, допускающих в качестве своего аргумента “нулевой объект” (представленный значением
0• В противном случае в качестве параметра следует использовать ссылку.
См. также раздел 8.5.6.
17.9.2. Указатели, ссылки и наследование
В разделе 14.3 мы видели, как можно использовать производный класс, такой как
CircleShapeCircle*ShapeShapeCirclevoid rotate(Shape* s, int n); // поворачиваем фигуру *s на угол nShape* p = new Circle(Point(100,100),40);Circle c(Point(200,200),50);rotate(&c,45);Это можно сделать и с помощью ссылок.
void rotate(Shape& s, int n); // поворачиваем фигуру *s на угол nShape& r = c;rotate(c,75);Этот факт является чрезвычайно важным для большинства объектно-ориентированных технологий программирования (см. разделы 14.3, 14.4).
17.9.3. Пример: списки
Наиболее распространенными и полезными структурами данных являются списки. Как правило, список создается с помощью узлов, каждый из которых содержит определенную информацию и указатель на другие узлы. Это — классический пример использования указателей. Например, короткий список норвежских богов можно представить в следующем виде.

struct Link { string value; Link* prev; Link* succ; Link(const string& v,Link* p = 0,Link* s = 0) :value(v),prev(p),succ(s) { }};Иначе говоря, имея объект типа
LinksuccprevLink* norse_gods = new Link("Thor",0,0);norse_gods = new Link("Odin",0,norse_gods);norse_gods–>succ–>prev = norse_gods;norse_gods = new Link("Freia",0,norse_gods);norse_gods–>succ–>prev = norse_gods;Мы создали этот список с помощью структуры
LinkТорsuccprevLink* insert(Link* p, Link* n) // вставка n перед p ( фрагмент ){ n–>succ = p; // p следует после n p–>prev–>succ = n; // n следует после предшественника p n–>prev = p–>prev; // предшественник p становится // предшественником n p–>prev = n; // n становится предшественником p return n;}Этот фрагмент программы работает, если указатель
pLinkLinkПриведенная версия функции
insert()npp–>prev0insertLink* insert(Link* p, Link* n) // вставляет n перед p; возвращает n{ if (n==0) return p; if (p==0) return n; n–>succ = p; // p следует после n if (p–>prev) p–>prev–>succ = n; n–>prev = p–>prev; // предшественник p становится // предшественником n