Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Armahem
0 / 0 / 0
Регистрация: 07.02.2014
Сообщений: 7
#1

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

07.02.2014, 19:19. Просмотров 285. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Синтаксис. Использование & (C++):

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

нестандартный синтаксис используйте "&", чтобы создать указатель на член - C++
Здравствуйте,начал изучать классы и вот такая фигня.Кому не сложно,помогите исправить #include "RECURSION_ONE.h" int...

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

Использование *& - C++
Помогите пожалуйста! На форуме не нашёл ответа.. объясните следующую строку void func1(class1*&amp;) class class2 { class2(); ...

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

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

7
Frosten
3 / 3 / 5
Регистрация: 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
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
07.02.2014, 20:28 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,293
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
Эксперт С++
1639 / 1011 / 119
Регистрация: 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
Привет! Вот еще темы с ответами:

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

Порядок вычисления: операторы «|» и «||», «&» и «&&» - C++
В Java булевые операторы «|» и «||», и «&amp;» и «&amp;&amp;» отличаются друг от друга порядком вычеслений, а в C++ так же как и в Java или...

Friend ostream& operator<<(ostream& stream, CArr& obj); - C++
CArr.h #pragma once class CArr{ int* arr = nullptr; int size = 10; void swap(int *a, int *b); void swap(int &amp;a, int &amp;b); ...

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &) - C++
Добрый день. Как осуществляется выделения памяти под перегруженный оператор ввода данных в пользовательский тип? Ведь мы заранее не можем...


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

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

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