C++ dasturlash tili Ko'rsatgichlar, referatlar va dinamik xotira ajratish
Передача ссылок на функции с аргументами ссылок и аргументами указателя
Download 267.5 Kb.
|
Язык программирования C
- Bu sahifa navigatsiya:
- Передача по ссылке с аргументами указателя
- Pass-by-reference с ссылочными аргументами
- "const" Параметры ссылки/указателя функции
Передача ссылок на функции с аргументами ссылок и аргументами указателяPass-by-ValueВ C/C++ по умолчанию аргументы передаются в функции по значению (за исключением массивов, которые обрабатываются как указатели). То есть создается клонированная копия аргумента, которая передается в функцию. Изменения, внесенные в клонированную копию внутри функции, не влияют на исходный аргумент вызывающего объекта. Другими словами, вызываемая функция не имеет доступа к переменным в вызывающем объекте. Например /* Pass-by-value into function (TestPassByValue.cpp) */ #include using namespace std; int square(int); int main() { int number = 8; cout << "In main(): " << &number << endl; // 0x22ff1c cout << number << endl; // 8 cout << square(number) << endl; // 64 cout << number << endl; // 8 - no change } int square(int n) { // non-const cout << "In square(): " << &n << endl; // 0x22ff00 n *= n; // clone modified inside the function return n; } Вывод ясно показывает, что есть два разных адреса. Передача по ссылке с аргументами указателяВо многих ситуациях мы можем захотеть изменить исходную копию напрямую (особенно при прохождении огромного объекта или массива), чтобы избежать накладных расходов на клонирование. Это можно сделать, передав указатель объекта в функцию, известную как pass-by-reference. Например /* Pass-by-reference using pointer (TestPassByPointer.cpp) */ #include using namespace std; void square(int *); int main() { int number = 8; cout << "In main(): " << &number << endl; // 0x22ff1c cout << number << endl; // 8 square(&number); // Explicit referencing to pass an address cout << number << endl; // 64 } void square(int * pNumber) { // Function takes an int pointer (non-const) cout << "In square(): " << pNumber << endl; // 0x22ff1c *pNumber *= *pNumber; // Explicit de-referencing to get the value pointed-to } Вызываемая функция работает с тем же адресом и, таким образом, может изменять переменную в вызывающем объекте. Pass-by-reference с ссылочными аргументамиВместо того, чтобы передавать указатели в функцию, вы также можете передавать ссылки в функцию, чтобы избежать неуклюжего синтаксиса ссылок и разыменовывания. Например /* Pass-by-reference using reference (TestPassByReference.cpp) */ #include using namespace std; void square(int &); int main() { int number = 8; cout << "In main(): " << &number << endl; // 0x22ff1c cout << number << endl; // 8 square(number); // Implicit referencing (without '&') cout << number << endl; // 64 } void square(int & rNumber) { // Function takes an int reference (non-const) cout << "In square(): " << &rNumber << endl; // 0x22ff1c rNumber *= rNumber; // Implicit de-referencing (without '*') } Опять же, выходные данные показывают, что вызываемая функция работает с тем же адресом и, таким образом, может изменять переменную вызывающего объекта. Обратите внимание, что ссылки (в вызывающем объекте) и разыменования (в функции) выполняются неявно. Единственное различие в кодировке с pass-by-value заключается в объявлении параметра функции. Напомним, что ссылки должны быть инициализированы во время объявления. В случае формального параметра функции при вызове функции инициализируются ссылки на аргументы вызывающего объекта. Ссылки в основном используются при передаче ссылок в / из функций, чтобы позволить вызываемой функции напрямую обращаться к переменным в вызывающем объекте. "const" Параметры ссылки/указателя функцииФормальный параметр функции не может быть изменен внутри функции. Используйте по возможности, так как это защищает вас от непреднамеренного изменения параметра и защищает вас от многих ошибок программирования.constconst Параметр функции может принимать как неаргументы, так и неаргументы. С другой стороны, параметр ссылки/указателя, не относящийся к функции, может получать только неаргумент. Напримерconstconstconstconstconst /* Test Function const and non-const parameter (FuncationConstParameter.cpp) */ #include using namespace std; int squareConst(const int); int squareNonConst(int); int squareConstRef(const int &); int squareNonConstRef(int &); int main() { int number = 8; const int constNumber = 9; cout << squareConst(number) << endl; cout << squareConst(constNumber) << endl; cout << squareNonConst(number) << endl; cout << squareNonConst(constNumber) << endl; cout << squareConstRef(number) << endl; cout << squareConstRef(constNumber) << endl; cout << squareNonConstRef(number) << endl; // cout << squareNonConstRef(constNumber) << endl; // error: invalid initialization of reference of // type 'int&' from expression of type 'const int' } int squareConst(const int number) { // number *= number; // error: assignment of read-only parameter return number * number; } int squareNonConst(int number) { // non-const parameter number *= number; return number; } int squareConstRef(const int & number) { // const reference return number * number; } int squareNonConstRef(int & number) { // non-const reference return number * number; } 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