Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Простой вопрос / 25 сообщений из 54, страница 1 из 3
16.04.2018, 14:57
    #39630851
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
Уважаемый программисты

Подскажите пожалуйста что обозначает данный код в С++

Код: plaintext
1.
2.
3.
   void t(std::string &s) {

   }




std::string &s - имеется ввиду эта часть

И чем этот код отличается от

Код: plaintext
1.
2.
3.
   void t(std::string s) {

   }




спасибо.
...
Рейтинг: 0 / 0
16.04.2018, 15:00
    #39630858
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
...
Рейтинг: 0 / 0
16.04.2018, 15:08
    #39630867
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
Хорошо я понял что в случае

std::string &s

будет передача по ссылке

Код: plaintext
1.
2.
3.
4.
   
   void t(std::string &s) {
       s = "a";
   }



Правильно я понимаю что вызывающий код

std::string b;
t(b);

Получит на выходе в b значение "a" ?

И чем отличается std::string *s от std::string& s ?
...
Рейтинг: 0 / 0
16.04.2018, 15:08
    #39630868
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
semen.s.semen, в первом случае передача параметра по ссылке, а во втором - по значению. Причем, в первом случае функция может изменить значение источника, передаваемого в функцию по ссылке.
...
Рейтинг: 0 / 0
16.04.2018, 15:10
    #39630870
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
semen.s.semenИ чем отличается std::string *s от std::string& s ?Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.
...
Рейтинг: 0 / 0
16.04.2018, 15:11
    #39630871
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
rdb_devsemen.s.semenИ чем отличается std::string *s от std::string& s ?Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.

А можно хотя бы примерно описать отличие ?

Или дать ссылки почитать

Буду очень благодарен.
...
Рейтинг: 0 / 0
16.04.2018, 15:12
    #39630872
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
semen.s.semenПравильно я понимаю что вызывающий код

std::string b;
t(b);

Получит на выходе в b значение "a" ?
Правильно. Это можно не спрашивать, а просто запустить и посмотреть.

semen.s.semenИ чем отличается std::string *s от std::string& s ?
Если по-простому: указатель может указывать в никуда, т.е. NULL, а ссылка не может.
...
Рейтинг: 0 / 0
16.04.2018, 15:13
    #39630875
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
semen.s.semenrdb_devпропущено...
Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.

А можно хотя бы примерно описать отличие ?

Или дать ссылки почитать

Буду очень благодарен.
Гугли "С++ указатели" и "С++ ссылки"
...
Рейтинг: 0 / 0
16.04.2018, 15:36
    #39630896
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
Dima Tsemen.s.semenпропущено...


А можно хотя бы примерно описать отличие ?

Или дать ссылки почитать

Буду очень благодарен.
Гугли "С++ указатели" и "С++ ссылки"

А смысл?

"Т. е. указатель или ссылка (как мы уже знаем, указатели и ссылки — это два синтаксически разных способа в C++ выразить понятие адреса).
"
...
Рейтинг: 0 / 0
16.04.2018, 15:42
    #39630904
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
Dima TЕсли по-простому: указатель может указывать в никуда, т.е. NULL, а ссылка не может.Да ладно?...
Код: plaintext
1.
int & rInt = *(int*)NULL;

Основное различие в том, что ссылка должна быть обязательно проинициализирована выражением, расценивающимся как lvalue.
...
Рейтинг: 0 / 0
16.04.2018, 15:47
    #39630908
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
rdb_devDima TЕсли по-простому: указатель может указывать в никуда, т.е. NULL, а ссылка не может.Да ладно?...
Код: plaintext
1.
int & rInt = *(int*)NULL;

Основное различие в том, что ссылка должна быть обязательно проинициализирована выражением, расценивающимся как lvalue.
Попробуй написать свой пример без использования указателей
...
Рейтинг: 0 / 0
16.04.2018, 15:47
    #39630909
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
rdb_devDima TЕсли по-простому: указатель может указывать в никуда, т.е. NULL, а ссылка не может.Да ладно?...
Код: plaintext
1.
int & rInt = *(int*)NULL;

Основное различие в том, что ссылка должна быть обязательно проинициализирована выражением, расценивающимся как lvalue.

Может быть как rvalue ?
...
Рейтинг: 0 / 0
16.04.2018, 15:50
    #39630911
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
Ролг Хупин"Т. е. указатель или ссылка (как мы уже знаем, указатели и ссылки — это два синтаксически разных способа в C++ выразить понятие адреса).
"
Не совсем. Указатель можно менять, а ссылка это только конкретный адрес. Лучше все-таки почитать про указатели.
...
Рейтинг: 0 / 0
16.04.2018, 16:06
    #39630924
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
std::string &s - имеется ввиду эта часть

Параметр функции, с названием s, типа "ссылка на std::string".

И чем этот код отличается от

Код: plaintext
1.
   void t(std::string s) {




Здесь параметр передаётся по значению, т.е. копируется.
Выше параметр передаётся по ссылке, только ссылка передаётся, сам объект НЕ копируется.
...
Рейтинг: 0 / 0
16.04.2018, 16:28
    #39630948
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
semen.s.semenrdb_devпропущено...
Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.

А можно хотя бы примерно описать отличие ?

Или дать ссылки почитать

Буду очень благодарен.

Указатель -- это адрес объекта определённого типа, который не обязательно установлен (адрес может быть пустым, не ссылаться ни на какой объект). Указатель за время жизни (переменной типа указателя) может ссылаться на несколько объектов этого типа.
Т.е. может ссылаться на от 0 до бесконечности разных объектов данного типа. К указателям применимы операции адресной арифметики (увеличение и уменьшение указателей, вычисление разницы между двумя указателями).

Ссылка -- это похожий, но существенно отличающийся от указателя, производный тип данных,
Ссылку часто понятийно представляют как другое имя объекта.
По сути ссылка -- это константный и всегда разыменованный указатель.
(разыменование -- это операция * , переход от указателя к значению объекта, на который указывает указатель).
Поскольку ссылка -- это константный указатель, сделать её ссылающейся на другой объект невозможно.
Также по стандарту языка С++ ссылка ОБЯЗАНА ссылаться на валидный и существующий объект данного типа.
Поскольку ссылка -- это разыменованный указатель, она выступает в выражениях как значение данного типа,
и к ссылке неприменимы операции адресной арифметики (для применения этих операций от ссылки нужно взять адрес, т.е. получить указатель).

Также идеологически в основном указатели применяются для оперирования данными, а ссылки -- для организации методов классов и функций, оперирующих классами.

То, что специальный указатель this оформлен именно как указатель, это ошибка дизайна С++, он должен был бы быть ссылкой.
Во многих остальных случаях где нужны ссылки на объекты в операциях и т.д. используются именно ссылки, а не указатели.
...
Рейтинг: 0 / 0
16.04.2018, 16:32
    #39630953
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
MasterZiv,

Огромное спасибо

Все доходчиво и по делу.
...
Рейтинг: 0 / 0
16.04.2018, 18:05
    #39631026
Простой вопрос
Ух ты, это я удачно на этот форум зашел. Сам как раз недавно разбирался с ссылками и указателями в C++, а тут такая тема.
MasterZiv, огромное спасибо за доходчивое объяснение.
...
Рейтинг: 0 / 0
16.04.2018, 18:36
    #39631048
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
MasterZiv,

расскажи про ссылки, пожалуйста. Не в контексте "ссылка как описатель аргумента функции", а в контексте "ссылка как альтернативное имя объекта", например:

Код: plaintext
1.
2.
int a;
int & b = a;



Если объект b - всего лишь синоним объекта a, то для чего он этот синоним вообще нужен? Ну, в каком случае имеет смысл использовать b вместо использования a?
...
Рейтинг: 0 / 0
16.04.2018, 18:46
    #39631052
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
КотовасияНу, в каком случае имеет смысл использовать b вместо использования a?

Я, например, использую тупо для сокращения кода:
Код: sql
1.
2.
3.
MyClass& var = Some->super()->expression[to].getIt();
var.a = 1;
var.b = 2;


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.04.2018, 19:20
    #39631085
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
Dimitry SibiryakovКотовасияНу, в каком случае имеет смысл использовать b вместо использования a?

Я, например, использую тупо для сокращения кода:
Код: sql
1.
2.
3.
MyClass& var = Some->super()->expression[to].getIt();
var.a = 1;
var.b = 2;



Понятно, чисто С++-шная фишка. В Delphi, C# и Java переменная экземпляра класса изначально является ссылкой (э... или указателем, ибо там нет разницы), поэтому там можно было бы просто записать:

Код: sql
1.
2.
3.
MyClass /*&*/ var = Some->super()->expression[to].getIt();
var.a = 1;
var.b = 2;


, без & .
...
ОК, сразу понятно, что также указатели полезны в общем случае, когда нужен доступ к объекту, например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int & f_max(int & a, int &b) {
	if (a > b)
		return a;
	else
		return b;
}
...
	int a = 1; 
	int b = 2; 
...
	f_max(a, b) = 3; // Заменить максимальное значение из a, b на 3.




Спасибо.
А еще в каких случаях?
...
Рейтинг: 0 / 0
16.04.2018, 19:23
    #39631088
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
Котовасия,

Плюсы прекрасны )
...
Рейтинг: 0 / 0
16.04.2018, 19:24
    #39631091
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
semen.s.semenКотовасия,

Плюсы прекрасны )

Да. Сейчас сын в ВУЗе изучает, я сбоку пристроился... :)
...
Рейтинг: 0 / 0
16.04.2018, 19:27
    #39631096
semen.s.semen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
Котовасияsemen.s.semenКотовасия,

Плюсы прекрасны )

Да. Сейчас сын в ВУЗе изучает, я сбоку пристроился... :)

А я вот спрашиваю себя - ну и нахера я стока времени на Java потратил )
...
Рейтинг: 0 / 0
16.04.2018, 19:34
    #39631102
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
А еще указатель это массив
Код: plaintext
1.
2.
3.
int f(int* a) {
   return *a + a[1] + *(a + 2);
}
...
Рейтинг: 0 / 0
16.04.2018, 19:40
    #39631106
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос
Dima TА еще указатель это массив
...

Вроде все книжки формулируют эту мысль с точность до наоборот "Массив это указатель"

Любой массив это указатель
Но НЕ каждый указатель, это массив
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Простой вопрос / 25 сообщений из 54, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]