Другие языки программирования и технологии

Вопрос про возвращаемое значение из функции в С++.

Чем отличается возвращение значения из функции по ссылке, int & func (int a, int b) {return (b+a)*b;} от возвращение значения из функции через указатель? int * func (int a, int b) {return (b+a)*b;} В учебнике (С++ за 24 часа) написано что возвращаемое значение через указатель возвращается адрес значения, а не само значение (это понятно), а значение по ссылке возвращается как-то по другому (но уж точно не само значение). Как именно, пока не разобрался. Проясните пож. мне этот вопрос. И ещё. Если объявлена переменная без слова const и она инициализирована, и потом переприсваивается к ней возвращаемое значение из функции обозначеное const, то потом это значение переменной изменить уже будет нельзя? Оно будет константное? const int func (int a, int b) {return (b+a)*b;} //Объявлена функция которая возвращает константное значение int x=0,c=2,d=4;//Объявлены и инициализированы //три переменные без ключевого слова const x=func (int c, int d);//Теперь возвращённое функцией //константное значение переприсваиваем переменной x Будет ли теперь значение переменной x постоянным (которое нельзя изменить) несмотря на то, что эта переменная была объявлена без ключевого слова const ?
HANDLE, ссылка - никак не адрес.
Ссылка - псевдоним некоторого значения.
const int & a = 3; // a - псевдоним для целочисленного литерала 3.
Указатель на 3 вы вообще никак не сделаете.
В C++ вообще следует заменять указатели ссылками везде, где это возможно: во-первых, сразу понятно, что клиент, получивший ссылку, не должен освобождать память, занимаемую ссылаемым объектом, а во-вторых это банально удобней и ближе к парадигме C++.
Как указатели, так и ссылки можно возвращать из функций только в двух случаях: либо объект, которому соответствует указатель или ссылка, находится в динамической памяти (куче) , либо это указатель/ссылка на this. Возвращать ссылки и указатели на объекты, расположенные в стеке (то есть, параметры функций и локальные переменные) категорически низя.

И ещё.

const int a = 3;
int b = a; // нормально.
b = 4 // почему бы и нет? значение a никак не зависит от b

const int & a = 3;
int & b = a; // не скомпилируется

int * a = new int(3);
const int * b = a; // нормально
int * c = b; // не скомпилируется

const char[] GetSomeConstArray() { return "Some immutable array"; }
char[] b = GetSomeConstArray(); // не скомпилируется

компилятор контролирует движение неизменяемых значений в процессе компиляции (опять же) , исключая любую возможность изменения константы. Впрочем, есть несколько дебильных исключений из этого правила, пришедших из C, таких как неявное преобразование строковых литералов к char *
char * s = "Immutable string?";
s[16] = "!"; // ошибка будет, возможно, но уже на этапе выполнения программы. От компилятора зависит.
АК
Анатолий Кувшинников
9 617
Лучший ответ
Ссылка - это адрес объекта. Указатель - это переменная, содержащая адрес объекта.
void (int &r, int *p) // здесь значения передаются и возвращаются по ссылке/указателю. В return ничего пихать не нужно.
// и возвращать ссылки и указатели на локальные переменные тоже никогда не нужно
{
// (*p) имеет тот же смысл, что и r

r += 2;// действия совершаются над объектом
(*p) += 2; // действия совершаются над объектом
p += 2;// действия совершаются над указателем
}

const int func() - это бред
Антон Семечкин
Антон Семечкин
21 360
При возвращении по указателю вы имеете адрес в явном виде и можете с ним что-то дальше делать. При возвращении по ссылке все равно реально возвращается адрес, но он уже разыменован и им можно пользоваться так, как если бы это был локальный объект.

2) Нет, если переменная объявлена без const, то ее всегда можно будет изменять, независимо от того, что ей присвоено.