powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Простой вопрос
25 сообщений из 54, страница 1 из 3
Простой вопрос
    #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
Простой вопрос
    #39630858
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Простой вопрос
    #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
Простой вопрос
    #39630868
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semen, в первом случае передача параметра по ссылке, а во втором - по значению. Причем, в первом случае функция может изменить значение источника, передаваемого в функцию по ссылке.
...
Рейтинг: 0 / 0
Простой вопрос
    #39630870
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenИ чем отличается std::string *s от std::string& s ?Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.
...
Рейтинг: 0 / 0
Простой вопрос
    #39630871
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devsemen.s.semenИ чем отличается std::string *s от std::string& s ?Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.

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

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

Буду очень благодарен.
...
Рейтинг: 0 / 0
Простой вопрос
    #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
Простой вопрос
    #39630875
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenrdb_devпропущено...
Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.

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

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

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


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

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

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

А смысл?

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

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



Если объект b - всего лишь синоним объекта a, то для чего он этот синоним вообще нужен? Ну, в каком случае имеет смысл использовать b вместо использования a?
...
Рейтинг: 0 / 0
Простой вопрос
    #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
Простой вопрос
    #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
Простой вопрос
    #39631088
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия,

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

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

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

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

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

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

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

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


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