C++ dasturlash tili Ko'rsatgichlar, referatlar va dinamik xotira ajratish
Передача возвращаемого значения функции
Download 267.5 Kb.
|
Язык программирования C
- Bu sahifa navigatsiya:
- Не следует передавать локальную переменную Function в качестве возвращаемого значения по ссылке
- Передача динамически выделяемой памяти в качестве возвращаемого значения по ссылке
Передача возвращаемого значения функцииПередача возвращаемого значения в качестве ссылкиВы также можете передать возвращаемое значение в качестве ссылки или указателя. Например /* 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling