Schumi |
Отправлено: 11.05.2005, 20:17 |
|
Машинист паровоза
Группа: Участник
Сообщений: 206
|
У меня есть функция, которая принимает в качестве параметра — ссылку на AnsiString. После этого при любом использовании данной функции выдается предупреждение — жить можно, но просто мне не нравятся когда есть хоть одно предупреждение . В чем причина?
P.S: если просто AnsiString — все хорошо.
|
|
Георгий |
Отправлено: 11.05.2005, 22:58 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
CODE | похоже ты написал
void func( AnsiString& str ){};
а если напишешь
void func( const AnsiString& ){};
то предупреждения при следующем вызове не будет
func( "asd" ); |
дело в том, что значение передаваемое в функцию преобразуется к типу входного агрумента, в данном случае AnsiString, и при передаче аргумента другого типа (например char*) в функцию будет передан временный объект сконструированный из char* (конструктор AnsiString(const char*)). но значение, передаваемое по ссылке, возможно изменить внутри функции. т.е. в этом случае изменен будет временный объект, созданный компилятором.
Спрашивается зачем функции изменять временный объект созданный компилятором? Вот компилятор ввиде такого предупреждения и задаёт тебе вопрос.
короче — передаёшь что-нибудь по ссылке, передавай ссылку на константный объект. |
|
Schumi |
Отправлено: 12.05.2005, 07:37 |
|
Машинист паровоза
Группа: Участник
Сообщений: 206
|
Спасибо за подробный ответ
|
|
Sl@Sh |
Отправлено: 12.05.2005, 16:24 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
QUOTE | короче — передаёшь что-нибудь по ссылке, передавай ссылку на константный объект |
А если предполагается изменить значение ? Да и потом компилятор не во всех случаях выдаёт такое сообщение.
Может вы просто не меняете значение ? Тогда const это то что нужно.
|
|
Schumi |
Отправлено: 12.05.2005, 19:52 |
|
Машинист паровоза
Группа: Участник
Сообщений: 206
|
Может я не прав: но меня всегда учили, что везде, где только можно нужно стараться передавать указатели. Понятно, что ради int,char,float — смысла нет (4 байта) — но когда целый класс передается, как параметр, то нужно ссылкой. Может я не прав.
|
|
Sl@Sh |
Отправлено: 12.05.2005, 20:59 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
Экономить желательно на всём. Даже 4 байта. Указатели поидее те же ссылки (тут я могу быть не прав).
|
|
Schumi |
Отправлено: 13.05.2005, 08:16 |
|
Машинист паровоза
Группа: Участник
Сообщений: 206
|
QUOTE (Sl@Sh @ 12/05/2005, 20:59) | Указатели поидее те же ссылки (тут я могу быть не прав). |
Ты знаешь не совсем.
|
|
Sl@Sh |
Отправлено: 13.05.2005, 16:28 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
Да я немного напутал. Ссылка — псевдоним, а указатель указывает на объект определённого типа.
|
|