Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Простой вопрос  [new]
semen.s.semen
Member

Откуда:
Сообщений: 1454
Уважаемый программисты

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

   void t(std::string &s) {

   }



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

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

   void t(std::string s) {

   }



спасибо.
16 апр 18, 14:57    [21342593]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Cerebrum
Member

Откуда: Омикрон Персей 8
Сообщений: 7754
let me google it for you
16 апр 18, 15:00    [21342607]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
semen.s.semen
Member

Откуда:
Сообщений: 1454
Хорошо я понял что в случае

std::string &s

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

   
   void t(std::string &s) {
       s = "a";
   }


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

std::string b;
t(b);

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

И чем отличается std::string *s от std::string& s ?
16 апр 18, 15:08    [21342634]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2459
semen.s.semen, в первом случае передача параметра по ссылке, а во втором - по значению. Причем, в первом случае функция может изменить значение источника, передаваемого в функцию по ссылке.
16 апр 18, 15:08    [21342635]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2459
semen.s.semen
И чем отличается std::string *s от std::string& s ?
Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.
16 апр 18, 15:10    [21342642]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
semen.s.semen
Member

Откуда:
Сообщений: 1454
rdb_dev
semen.s.semen
И чем отличается std::string *s от std::string& s ?
Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.


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

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

Буду очень благодарен.
16 апр 18, 15:11    [21342645]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Dima T
Member

Откуда:
Сообщений: 12871
semen.s.semen
Правильно я понимаю что вызывающий код

std::string b;
t(b);

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

Правильно. Это можно не спрашивать, а просто запустить и посмотреть.

semen.s.semen
И чем отличается std::string *s от std::string& s ?

Если по-простому: указатель может указывать в никуда, т.е. NULL, а ссылка не может.
16 апр 18, 15:12    [21342647]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Dima T
Member

Откуда:
Сообщений: 12871
semen.s.semen
rdb_dev
пропущено...
Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.


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

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

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

Гугли "С++ указатели" и "С++ ссылки"
16 апр 18, 15:13    [21342653]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2257
Dima T
semen.s.semen
пропущено...


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

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

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

Гугли "С++ указатели" и "С++ ссылки"


А смысл?

"Т. е. указатель или ссылка (как мы уже знаем, указатели и ссылки — это два синтаксически разных способа в C++ выразить понятие адреса).
"
16 апр 18, 15:36    [21342757]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2459
Dima T
Если по-простому: указатель может указывать в никуда, т.е. NULL, а ссылка не может.
Да ладно?...
int & rInt = *(int*)NULL;
Основное различие в том, что ссылка должна быть обязательно проинициализирована выражением, расценивающимся как lvalue.
16 апр 18, 15:42    [21342784]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Dima T
Member

Откуда:
Сообщений: 12871
rdb_dev
Dima T
Если по-простому: указатель может указывать в никуда, т.е. NULL, а ссылка не может.
Да ладно?...
int & rInt = *(int*)NULL;
Основное различие в том, что ссылка должна быть обязательно проинициализирована выражением, расценивающимся как lvalue.

Попробуй написать свой пример без использования указателей
16 апр 18, 15:47    [21342797]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
semen.s.semen
Member

Откуда:
Сообщений: 1454
rdb_dev
Dima T
Если по-простому: указатель может указывать в никуда, т.е. NULL, а ссылка не может.
Да ладно?...
int & rInt = *(int*)NULL;
Основное различие в том, что ссылка должна быть обязательно проинициализирована выражением, расценивающимся как lvalue.


Может быть как rvalue ?
16 апр 18, 15:47    [21342799]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Dima T
Member

Откуда:
Сообщений: 12871
Ролг Хупин
"Т. е. указатель или ссылка (как мы уже знаем, указатели и ссылки — это два синтаксически разных способа в C++ выразить понятие адреса).
"

Не совсем. Указатель можно менять, а ссылка это только конкретный адрес. Лучше все-таки почитать про указатели.
16 апр 18, 15:50    [21342806]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34354
std::string &s - имеется ввиду эта часть

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

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

   void t(std::string s) {



Здесь параметр передаётся по значению, т.е. копируется.
Выше параметр передаётся по ссылке, только ссылка передаётся, сам объект НЕ копируется.
16 апр 18, 16:06    [21342844]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34354
semen.s.semen
rdb_dev
пропущено...
Для того, чтобы понять отличия указателя и ссылки, необходимо тщательно изучить перегрузку операторов.


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

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

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


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

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

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

То, что специальный указатель this оформлен именно как указатель, это ошибка дизайна С++, он должен был бы быть ссылкой.
Во многих остальных случаях где нужны ссылки на объекты в операциях и т.д. используются именно ссылки, а не указатели.
16 апр 18, 16:28    [21342906]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
semen.s.semen
Member

Откуда:
Сообщений: 1454
MasterZiv,

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

Все доходчиво и по делу.
16 апр 18, 16:32    [21342916]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Ржавый гвоздь
Member

Откуда:
Сообщений: 15
Ух ты, это я удачно на этот форум зашел. Сам как раз недавно разбирался с ссылками и указателями в C++, а тут такая тема.
MasterZiv, огромное спасибо за доходчивое объяснение.
16 апр 18, 18:05    [21343180]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
MasterZiv,

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

int a;
int & b = a;


Если объект b - всего лишь синоним объекта a, то для чего он этот синоним вообще нужен? Ну, в каком случае имеет смысл использовать b вместо использования a?
16 апр 18, 18:36    [21343243]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46362

Котовасия
Ну, в каком случае имеет смысл использовать b вместо использования a?

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

Posted via ActualForum NNTP Server 1.5

16 апр 18, 18:46    [21343265]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
Dimitry Sibiryakov
Котовасия
Ну, в каком случае имеет смысл использовать b вместо использования a?

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


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

MyClass /*&*/ var = Some->super()->expression[to].getIt();
var.a = 1;
var.b = 2;

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

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.



Спасибо.
А еще в каких случаях?
16 апр 18, 19:20    [21343360]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
semen.s.semen
Member

Откуда:
Сообщений: 1454
Котовасия,

Плюсы прекрасны )
16 апр 18, 19:23    [21343366]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
semen.s.semen
Котовасия,

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


Да. Сейчас сын в ВУЗе изучает, я сбоку пристроился... :)
16 апр 18, 19:24    [21343371]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
semen.s.semen
Member

Откуда:
Сообщений: 1454
Котовасия
semen.s.semen
Котовасия,

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


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


А я вот спрашиваю себя - ну и нахера я стока времени на Java потратил )
16 апр 18, 19:27    [21343382]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Dima T
Member

Откуда:
Сообщений: 12871
А еще указатель это массив
int f(int* a) {
   return *a + a[1] + *(a + 2);
}

16 апр 18, 19:34    [21343393]     Ответить | Цитировать Сообщить модератору
 Re: Простой вопрос  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7201
Dima T
А еще указатель это массив
...

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

Любой массив это указатель
Но НЕ каждый указатель, это массив
16 апр 18, 19:40    [21343406]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / C++ Ответить