Другие языки программирования и технологии
Вопрос про возвращаемое значение из функции в С++.
Чем отличается возвращение значения из функции по ссылке, 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] = "!"; // ошибка будет, возможно, но уже на этапе выполнения программы. От компилятора зависит.
Ссылка - псевдоним некоторого значения.
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] = "!"; // ошибка будет, возможно, но уже на этапе выполнения программы. От компилятора зависит.
Ссылка - это адрес объекта. Указатель - это переменная, содержащая адрес объекта.
void (int &r, int *p) // здесь значения передаются и возвращаются по ссылке/указателю. В return ничего пихать не нужно.
// и возвращать ссылки и указатели на локальные переменные тоже никогда не нужно
{
// (*p) имеет тот же смысл, что и r
r += 2;// действия совершаются над объектом
(*p) += 2; // действия совершаются над объектом
p += 2;// действия совершаются над указателем
}
const int func() - это бред
void (int &r, int *p) // здесь значения передаются и возвращаются по ссылке/указателю. В return ничего пихать не нужно.
// и возвращать ссылки и указатели на локальные переменные тоже никогда не нужно
{
// (*p) имеет тот же смысл, что и r
r += 2;// действия совершаются над объектом
(*p) += 2; // действия совершаются над объектом
p += 2;// действия совершаются над указателем
}
const int func() - это бред
При возвращении по указателю вы имеете адрес в явном виде и можете с ним что-то дальше делать. При возвращении по ссылке все равно реально возвращается адрес, но он уже разыменован и им можно пользоваться так, как если бы это был локальный объект.
2) Нет, если переменная объявлена без const, то ее всегда можно будет изменять, независимо от того, что ей присвоено.
2) Нет, если переменная объявлена без const, то ее всегда можно будет изменять, независимо от того, что ей присвоено.
Похожие вопросы
- С++. Вопрос про возвращаемое значение из функции
- Помогите с Си. Вопрос по заданию (насчет типизированной функции, которая должна возвращать массив)
- В чем разница между функциями, которые возвращают значения и которые не возвращают? Не вникаю в смысл слова "возвращает"
- Что значит "функция возвращает значение" в С++?
- как в с++ возвращать значение функции больше одного? допустим сразу несколько значений
- Что значит возвращает значение функции? для чего нужен оператор return в си? как он работает?
- что значит в программировании функция, которая возвращает значение.
- Вопрос насчет объявления и параметра функции в C++
- Что значит "возвращать значение" в языках программирования?
- С++.Составить программу для определения таблицы значений функции у в произвольном диапазоне [a, b