Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Armahem
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 7
#1

Синтаксис. Использование &

07.02.2014, 19:19. Просмотров 808. Ответов 7
Метки нет (Все метки)

Скажите, пожалуйста, чем отличается
C++
1
foo(std::string a);
от этого
C++
1
foo(std::string& a);
?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2014, 19:19
Ответы с готовыми решениями:

Поясните синтаксис - ( std::string& x: bar )
Наткнулся здесь на использование двоеточия для какого-то рода инициализации...

нестандартный синтаксис используйте "&", чтобы создать указатель на член
Здравствуйте,начал изучать классы и вот такая фигня.Кому не сложно,помогите...

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;)
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef...

Использование *&
Помогите пожалуйста! На форуме не нашёл ответа.. объясните следующую строку...

"Нестандартный синтаксис, используйте "&", чтобы создать указатель на член"
Ошибка в строке 79: Animals::Show нестандартный синтаксис, используйте &quot;&amp;&quot;,...

7
Frosten
3 / 3 / 6
Регистрация: 28.01.2014
Сообщений: 13
07.02.2014, 19:36 #2
Это называется ссылка.
почитай тут
http://ru.wikipedia.org/wiki/%D0%A1%...0%B0_(C%2B%2B)
0
Armahem
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 7
07.02.2014, 20:03  [ТС] #3
Цитата Сообщение от Frosten Посмотреть сообщение
Это называется ссылка.
почитай тут
http://ru.wikipedia.org/wiki/%D0%A1%...0%B0_(C%2B%2B)
Да, я знаю. Меня больше интересует в чём отличие следующих двух функций:
C++
1
2
3
4
5
6
7
8
9
10
std::string& getNameAmp()
{
     static std::string _name; _name.clear(); _name = "Some_Name";
     return _name;
}
std::string getName()
{
     static std::string _name; _name.clear(); _name = "Some_Name";
     return _name;
}
Ведь обе функции можно использовать так:
C++
1
2
getName().c_str();
getNameAmp().c_str();
Т. е. через точку обращаться к методам класса строки, а не через ->
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
07.02.2014, 20:28 #4
Лучший ответ Сообщение было отмечено Vourhey как решение

Решение

getNameAmp вернёт ссылку (то есть, указание "где лежит") на строку, которая уже была уничтожена при выходе из функции и уже нигде не лежит. Работа с этой ссылкой приведёт к неопределённому поведению, на практике - к неправильной работе программы и неожиданным и неочевидным ошибкам.
getName вернёт копию строки, которую никак не затронет уничтожение оригинала и которой можно безопасно пользоваться.
Аналогично, первый вариант foo получает копию строки, и всё, что он проделает с этой копией, не отразится на оригинале. Второй вариант получает ссылку на оригинал и имеет возможность этот оригинал изменить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo1(std::string a) {a = "bbb";}
 
void foo2(std::string& a) {a = "bbb";}
 
int main(){
    string x("aaa");
    cout << x;  // напечатает aaa
    foo1(x);
    cout << x;  // снова напечатает aaa
    foo2(x);
    cout << x;  // напечатает bbb
}
1
Armahem
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 7
07.02.2014, 20:37  [ТС] #5
Спасибо, теперь всё понятно.
Цитата Сообщение от Nick Alte Посмотреть сообщение
getNameAmp вернёт ссылку (то есть, указание "где лежит") на строку, которая уже была уничтожена при выходе из функции и уже нигде не лежит. Работа с этой ссылкой приведёт к неопределённому поведению, на практике - к неправильной работе программы и неожиданным и неочевидным ошибкам. ...
Разве статические переменные уничтожаются при выходе из функции?
0
DrOffset
7996 / 4637 / 1127
Регистрация: 30.01.2014
Сообщений: 7,543
07.02.2014, 20:43 #6
Цитата Сообщение от Armahem Посмотреть сообщение
Спасибо, теперь всё понятно.
Разве статические переменные уничтожаются при выходе из функции?
Не уничтожаются. Но если убрать static, то все будет имено так, как он описал.
0
Armahem
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 7
07.02.2014, 20:45  [ТС] #7
Ясно, спасибо.
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
07.02.2014, 20:46 #8
Цитата Сообщение от Armahem Посмотреть сообщение
Разве статические переменные уничтожаются при выходе из функции?
Невнимательно посмотрел, упустил волшебное слово static.
0
07.02.2014, 20:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2014, 20:46

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration?
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp;...

В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9&
В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка?
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru