Правила программирования на Си и Си++



         

121. Никогда не используйте ссылки в качестве результатов, пользуйтесь указателями


Использование ссылочных аргументов в языке программирования вызвано четырьмя причинами:

·

Они нужны вам для определения конструктора копии.

·      Они нужны вам для определения перегруженных операций. Если вы определили:

some_class *operator+( some_class *left, some_class *right );

то вы должны сделать такое дополнение:

some_class x, y;

x = *(&x + &y)

Использование ссылок для аргумента и возвращаемого значения позволяет вам написать:

x = x + 1;

·      Вы часто хотите передать объекты по значению, исходя из логики. Например, вы обычно в функцию передаете тип double, а не указатель на double. Тем не менее, тип double представляет собой 8-байтовую упакованную структуру с тремя полями: знаковым битом, мантиссой и порядком. Передавайте в этой ситуации ссылку на константный объект.

·      Если объект какого-нибудь определенного пользователем класса обычно передается по значению, то используйте вместо этого ссылку на константный объект, чтобы избежать неявного вызова конструктора копии.

Ссылки в языке не предназначены для имитации Паскаля и не должны использоваться так, как используются в программе на Паскале.

Проблема ссылочных аргументов — сопровождение. В прошлом году один из наших сотрудников написал следующую подпрограмму:


void copy_word( char *target, char

*&src ) // src является

                                           // ссылкой на char*

{

   while( isspace(*src) )

      ++src;                    // Инкрементировать указатель,

                                // на который ссылается src.

   while( *src && !isspace(*src) )

   *target++ = *src++;         // Передвинуть указатель,

                               // на который ссылается src,

                               // за

 

текущее слово.

}

Автор полагал, что вы будете вызывать copy_word()

многократно. Каждый раз подпрограмма копировала бы следующее слово в буфер target и продвигала бы указатель в источнике.




Содержание  Назад  Вперед