C++ dasturlash tili Ko'rsatgichlar, referatlar va dinamik xotira ajratish


Передача возвращаемого значения функции


Download 267.5 Kb.
bet8/14
Sana20.06.2023
Hajmi267.5 Kb.
#1630767
TuriReferat
1   ...   4   5   6   7   8   9   10   11   ...   14
Bog'liq
Язык программирования C

Передача возвращаемого значения функции

Передача возвращаемого значения в качестве ссылки

Вы также можете передать возвращаемое значение в качестве ссылки или указателя. Например
/* Passing back return value using reference (TestPassByReferenceReturn.cpp) */
#include
using namespace std;
int & squareRef(int &);
int * squarePtr(int *);
int main() {
int number1 = 8;
cout << "In main() &number1: " << &number1 << endl; // 0x22ff14
int & result = squareRef(number1);
cout << "In main() &result: " << &result << endl; // 0x22ff14
cout << result << endl; // 64
cout << number1 << endl; // 64
int number2 = 9;
cout << "In main() &number2: " << &number2 << endl; // 0x22ff10
int * pResult = squarePtr(&number2);
cout << "In main() pResult: " << pResult << endl; // 0x22ff10
cout << *pResult << endl; // 81
cout << number2 << endl; // 81
}
int & squareRef(int & rNumber) {
cout << "In squareRef(): " << &rNumber << endl; // 0x22ff14
rNumber *= rNumber;
return rNumber;
}
int * squarePtr(int * pNumber) {
cout << "In squarePtr(): " << pNumber << endl; // 0x22ff10
*pNumber *= *pNumber;
return pNumber;
}
Не следует передавать локальную переменную Function в качестве возвращаемого значения по ссылке

/* Test passing the result (TestPassResultLocal.cpp) */
#include
using namespace std;
int * squarePtr(int);
int & squareRef(int);
int main() {
int number = 8;
cout << number << endl; // 8
cout << *squarePtr(number) << endl; // ??
cout << squareRef(number) << endl; // ??
}
int * squarePtr(int number) {
int localResult = number * number;
return &localResult;
// warning: address of local variable 'localResult' returned
}
int & squareRef(int number) {
int localResult = number * number;
return localResult;
// warning: reference of local variable 'localResult' returned
}
Эта программа имеет серьезную логическую ошибку, так как локальная переменная функции передается обратно в качестве возвращаемого значения по ссылке. Локальная переменная имеет локальную область действия внутри функции, и ее значение уничтожается после выхода из функции. Компилятор GCC достаточно любезен, чтобы выдать предупреждение (но не ошибку).
Можно безопасно возвращать ссылку, которая передается в функцию в качестве аргумента. Смотрите предыдущие примеры.
Передача динамически выделяемой памяти в качестве возвращаемого значения по ссылке

Вместо этого необходимо динамически выделять переменную для возвращаемого значения и возвращать ее по ссылке.
/* Test passing the result (TestPassResultNew.cpp) */
#include
using namespace std;
int * squarePtr(int);
int & squareRef(int);
int main() {
int number = 8;
cout << number << endl; // 8
cout << *squarePtr(number) << endl; // 64
cout << squareRef(number) << endl; // 64
}
int * squarePtr(int number) {
int * dynamicAllocatedResult = new int(number * number);
return dynamicAllocatedResult;
}
int & squareRef(int number) {
int * dynamicAllocatedResult = new int(number * number);
return *dynamicAllocatedResult;
}
Сводка
Указатели и ссылки очень сложны и трудны для освоения. Но они могут значительно повысить эффективность программ.
Новичкам следует избегать использования указателей в программе. Неправильное использование может привести к серьезным логическим ошибкам. Однако необходимо понимать синтаксис pass-by-reference с указателями и ссылками, так как они используются во многих библиотечных функциях.

  • В pass-by-value создается клон, который передается в функцию. Копия вызывающего абонента не может быть изменена.

  • При переходе по ссылке в функцию передается указатель. Копия вызывающего объекта может быть изменена внутри функции.

  • При передаче ссылочных аргументов в качестве аргумента используется имя переменной.

  • При переходе по ссылке с аргументами указателя необходимо использовать (адрес) в качестве аргумента.&varName


Download 267.5 Kb.

Do'stlaringiz bilan baham:
1   ...   4   5   6   7   8   9   10   11   ...   14




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling